2016-03-16 12 views
0

В моем исследовании JPA у меня есть код ниже (который, как я понимаю, не должен использоваться на производстве). Запуск мой код выдает следующее сообщение об ошибке:Glassfish - не удается удалить объект с использованием JPA

java.lang.IllegalStateException: 
Exception Description: Cannot use an EntityTransaction while using JTA. 

Код ресурса заключается в следующем:

@Path("users") 
public class UsersAPI { 
    @Context 
    UriInfo uriInfo; 

    @Inject 
    UserBean accountsBean; 

    @GET 
    @Path("deduplicate") 
    public Response deduplicateDB(){ 
     List<UserProfile> profiles = accountsBean.getAll(); 
     int profilesNum = profiles.size(); 
     for(int i = 0; i < profilesNum; ++i){ 
      for(int k = 0; k < profilesNum; ++k){ 
       if(i != k){ //if it's not the same profile 
        if(profiles.get(i).getUsername().equals(profiles.get(k).getUsername())){ 
         accountsBean.remove(profiles.get(k)); 
         profiles.remove(k); 
        } 
       } 
       profilesNum = profiles.size(); 
      } 
     } 
     return Response.ok().build(); 
    } 
} 

Код в ProfilesBean выглядит следующим образом:

@Local 
@Stateless 
public class UserBean { 
    @PersistenceContext 
    EntityManager eManager; 

    public void save(UserProfile data){ 
     eManager.merge(data); 
    } 

    public void remove(UserProfile data){ 
     eManager.getTransaction().begin(); 
     eManager.remove(data); 
     eManager.getTransaction().commit(); 
    } 

    public List<UserProfile> getAll(){ 
     Query q = eManager.createQuery("SELECT profile FROM Users profile"); 
     return (List<UserProfile>)q.getResultList(); 
    } 
} 

Вот код класс Entity:

@Entity(name="Users") 
public class UserProfile { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    Long id; 
    String password; 
    @Column(unique=true) 
    String username; 

    public UserProfile(String username){ 
     setUsername(username); 
    } 
    public UserProfile(){ 
     this(null); 
    } 
    public String getUsername() { 
     return username; 
    } 
    public void setUsername(String username) { 
     this.username = username; 
    } 
} 

Похоже, что ошибка возникает из-за неправильного использования платформы. Как я могу исправить этот код и не злоупотреблять платформой в будущем?

ответ

1

Если вы используете JTA в транзакции типа в persistence.xml файл просто оставить JTA обрабатывает ваши транзакции

public void remove(UserProfile data){ 
    eManager.remove(eManager.merge(data)); 
} 

UPDATE: В более четкого решения, которое вы могли бы использовать «найти», но вы необходимо указать идентификатор объекта

public void remove(UserProfile data){ 
    UserProfile e = em.find(UserProfile.class, data.getId()); 
    eManager.remove(e); 
} 
+0

Это, вероятно, хороший ответ, но что такое JTA? Я не знаю, как установить такую ​​вещь в persistence.xml – KG6ZVP

+0

Возможно, это ваш по умолчанию. В качестве спецификации «В среде Java EE, если этот элемент не указан, по умолчанию используется JTA». В файле persistence.xml вы указываете, следует ли использовать JTA o RESOURCE_LOCAL для предоставления источника данных. С JTA контейнер предоставляет источник данных. –

+0

Я попробую и отправлю обратно. – KG6ZVP

 Смежные вопросы

  • Нет связанных вопросов^_^