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();
但是在执行此操作时,数据库不会更新。有人在乎解释我错过了什么吗?预先感谢您花时间学习一个简单的问题:)
答案 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进行自动事务管理。