Glassfish - не может удалить объект, используя JPA

В моем исследовании 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));
}

ОБНОВЛЕНИЕ: В более понятном решении вы могли бы использовать "найти", но вам нужно предоставить идентификатор объекта

public void remove(UserProfile data){
    UserProfile e = em.find(UserProfile.class, data.getId());
    eManager.remove(e);
}
Другие вопросы по тегам