Glassfish - 无法使用 JPA 删除实体

Glassfish - cannot remove entity using 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();
    }
}

这是实体的代码 class:

@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;
    }
}

这个错误似乎是我以某种方式滥用平台造成的。我怎样才能修复此代码并且将来不会滥用该平台?

如果您在 persistence.xml 文件中使用 JTA 作为事务类型,请让 JTA 处理您的事务

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

更新: 在更清晰的解决方案中,您可以使用 "find",但您需要提供对象 ID

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