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
是的,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
是的,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。保存(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();