持久化对象时出现IllegalStateException

时间:2014-09-19 11:30:29

标签: java postgresql jpa jta

public void lagreMelding(String bruker, String msg) {
        EntityManager em = emf.createEntityManager();
        Melding melding = new Melding(bruker, msg);
    try {
        em.getTransaction().begin();
        em.persist(melding);
        em.getTransaction().commit();
        em.close();
    } catch (RollbackException e) {
        em.getTransaction().rollback();
    }
}

错误报告如下:

java.lang.IllegalStateException: 
Exception Description: Cannot use an EntityTransaction while using JTA.
    org.eclipse.persistence.internal.jpa.transaction.JTATransactionWrapper.getTransaction(JTATransactionWrapper.java:73)
    org.eclipse.persistence.internal.jpa.EntityManagerImpl.getTransaction(EntityManagerImpl.java:1311)
    no.hib.dat104.oblig1.Kontroll.lagreMelding(Kontroll.java:37)
    no.hib.dat104.oblig1.MeldingServlet.doPost(MeldingServlet.java:80)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

此问题的所有其他示例已通过删除

解决
em.getTransaction().begin();

em.getTransaction().commit();

但是在执行此操作时,数据库不会更新。有人在乎解释我错过了什么吗?预先感谢您花时间学习一个简单的问题:)

2 个答案:

答案 0 :(得分:0)

使用JTA时,您无法以这种方式开始和提交事务,请尝试以下方法:

public void lagreMelding(String bruker, String msg) {
        EntityManager em = emf.createEntityManager();
        Melding melding = new Melding(bruker, msg);

        UserTransaction transaction = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");

    try {
        transaction.begin();
        em.persist(melding);
        transaction.commit();
        em.close();
    } catch (RollbackException e) {
        transaction.rollback();
    }
}

答案 1 :(得分:0)

从堆栈跟踪中我假设你试图从一些web应用程序中使用Servlet方法在JPA中持久保存实体。您还在使用JTA事务管理。使用此类事务管理,您无法像使用资源本地事务管理那样对从EntityManager获取的EntityTransaction进行操作。您必须允许容器为您提供UserTransaction

@Resource
UserTransaction tx;

然后使用begin()commit()rollback()对其进行操作。

try {
    tx.begin();
    em.persist(melding);
    tx.commit();
} catch (Exception e) {
    if (status.STATUS_MARKED_ROLLBACK == tx.getStatus()) {
      try {
       tx.rollback();
      } catch (SystemException e1) {
        //log error
      }
    }
} finally () {
    em.close();
}

正如您已经注意到手动维护交易一样麻烦。这就是为什么,如果可能的话,我使用EJB bean进行自动事务管理。