Java JPA错误:事务当前处于活动状态
当我单独运行单元测试时,它们工作得很好(省略了断言) 然后在下面运行这个单独的测试没有问题Java JPA错误:事务当前处于活动状态,java,spring,jpa,Java,Spring,Jpa,当我单独运行单元测试时,它们工作得很好(省略了断言) 然后在下面运行这个单独的测试没有问题 @Test public void testUpdate() { EntityManagerHelper emh = new EntityManagerHelper(); LevelDAO dao = new LevelDAO(); Level l = new Level(); l.setName("bname"); l.setLevelid(1); emh.beginTransaction(); da
@Test
public void testUpdate()
{
EntityManagerHelper emh = new EntityManagerHelper();
LevelDAO dao = new LevelDAO();
Level l = new Level();
l.setName("bname");
l.setLevelid(1);
emh.beginTransaction();
dao.update(l);
emh.commit();
}
当它们按顺序同时运行时,我收到错误-事务当前处于活动状态。是否有一种方法允许每个单元测试只在前一个工作的事务未激活后运行?我应该看看春天吗
更新
EntityManagerHelper可以像这样访问持久性上下文
emf = Persistence.createEntityManagerFactory("bw_beta");
threadLocal = new ThreadLocal<EntityManager>();
很确定有更好的方法-也许使用Spring?- 很确定有更好的方法-也许使用Spring
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:META-INF/conf/spring/application-context.xml",
"classpath:META-INF/conf/spring/test-datasource-spring-config.xml" })
@TransactionConfiguration(transactionManager="txMgr", defaultRollback=false)
public class LevelDaoTest {
@Resource( name="levelDao" )
LevelDao levelDao;
@Test
public void shouldSaveNewLevels() {
Level l = new Level();
l.setName("aname");
levelDao.save(l);
// assert
}
@Test
public void shouldUpdateExistingLevels() {
Level l = new Level(); // or I would assume, you'd read this level back from DB, or set a proper ID, so the DAO will know to update it.. But that is besides the point
l.setName("bname");
levelDao.update(l);
// assert
}
}
查看下的Spring文档以获取更多详细信息
从您的示例中,请注意:
看起来真的很奇怪,因为通常您会将entityManager
封装在DAO中,所以您需要做的就是DAO.save(l)
- 很确定有更好的方法-也许使用Spring
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:META-INF/conf/spring/application-context.xml",
"classpath:META-INF/conf/spring/test-datasource-spring-config.xml" })
@TransactionConfiguration(transactionManager="txMgr", defaultRollback=false)
public class LevelDaoTest {
@Resource( name="levelDao" )
LevelDao levelDao;
@Test
public void shouldSaveNewLevels() {
Level l = new Level();
l.setName("aname");
levelDao.save(l);
// assert
}
@Test
public void shouldUpdateExistingLevels() {
Level l = new Level(); // or I would assume, you'd read this level back from DB, or set a proper ID, so the DAO will know to update it.. But that is besides the point
l.setName("bname");
levelDao.update(l);
// assert
}
}
查看下的Spring文档以获取更多详细信息
从您的示例中,请注意:
看起来真的很奇怪,因为通常您会将
entityManager
封装在一个DAO中,所以您需要做的就是DAO。保存(l)
对于可能存在此问题的任何人,这里是我如何解决它的。我进行了多次保存,并且不断出现此错误。如果不检查多个事务是否处于活动状态,则不希望开始多个事务
if(!entityManager.getTransaction().isActive())
entityManager.getTransaction().begin();
dao.save(l);
entityManager.persist(l);
entityManager.getTransaction().commit();
我实现了一种单例方法来处理它。对于任何可能有此问题的人,这里是我如何解决它的。我进行了多次保存,并且不断出现此错误。如果不检查多个事务是否处于活动状态,则不希望开始多个事务
if(!entityManager.getTransaction().isActive())
entityManager.getTransaction().begin();
dao.save(l);
entityManager.persist(l);
entityManager.getTransaction().commit();
我实现了一种单例方法来处理它。EntityManagerHelper内部发生了什么?@DataNucleus:他没有说他想并行运行它们。异常的堆栈跟踪是什么?EntityManagerHelper内部发生了什么?@DataNucleus:他没有说他想并行运行它们。这是什么异常的堆栈跟踪?
if(!entityManager.getTransaction().isActive())
entityManager.getTransaction().begin();
dao.save(l);
entityManager.persist(l);
entityManager.getTransaction().commit();