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);
}
在我对 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);
}