2016-03-16 55 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(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

如果您在persistence.xml文件中使用JTA如事務型見好就收JTA處理您的交易

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

UPDATE: 在更明確的解決方案,您可以使用「查找」,但你需要提供對象ID

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ØRESOURCE_LOCAL提供數據源。使用JTA容器提供數據源。 –

+0

我會盡力回覆。 – KG6ZVP