【发布时间】:2013-12-04 12:15:45
【问题描述】:
所以我这里有这段代码
User us = new User();
us.setId(id1);
us.setUsername(userNameTextField.getText());
us.setPassowrd(passwordFormattedTextField.getText());
us.setLevel(levelComboBox.getSelectedItem().toString());
us.setEmpid(getCurrentEmp());
getCurrentEmp().getUserCollection().add(us);
em.getTransaction().begin();
em.persist(getCurrentEmp());
em.flush();
em.getTransaction().commit();
但是当我尝试提交时,我得到了这个错误
Exception Description: No transaction is currently active
at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionWrapper.throwCheckTransactionFailedException(EntityTransactionWrapper.java:87)
at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionWrapper.checkForTransaction(EntityTransactionWrapper.java:50)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.checkForTransaction(EntityManagerImpl.java:2015)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.flush(EntityManagerImpl.java:846)
我没有得到 y,因为我已经按如下方式调用了 entitymanager 实例
em = emi.getInstance();
来自这个班级
public class EmInstance {
EntityManager em;
public EntityManager getInstance(){
em = Persistence.createEntityManagerFactory("samplePU").createEntityManager();
return em;
}
}
我的问题是,当我想使用它时如何使事务处于活动状态,例如在提交、更新或任何其他事务过程时。我正在使用 eclipselink 及其桌面应用程序
【问题讨论】:
-
您使用的是哪个版本的 eclipselink,如果您还没有,可以尝试最新的版本吗?
-
异常是由刷新引起的,可能是持久化提供程序触发的隐式刷新;您可能想尝试将 getTransaction().begin() 移到方法的开头,以确保事务在可能涉及 JPA 的任何地方都处于活动状态。
-
如果您使用的是容器管理事务,那么 spring 的 @Transactional 注释将在您的方法中工作。如果您使用的是 REOURCE_LOCAL 类型,那么您需要以编程方式开始并提交事务。
标签: java jpa eclipselink desktop-application