Java EntityManager在Spring JUnit测试期间处于关闭状态

Java EntityManager在Spring JUnit测试期间处于关闭状态,java,spring,junit,entitymanager,spring-test,Java,Spring,Junit,Entitymanager,Spring Test,我有一个具有以下配置的类测试: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = ContextPersistenceTest.class) 在ContextPersistenceTest中,我有EntityManager的配置: public @Bean(name = "entityManagerFactory") EntityManagerFactory entityManagerFactory

我有一个具有以下配置的类测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ContextPersistenceTest.class)
在ContextPersistenceTest中,我有EntityManager的配置:

public @Bean(name = "entityManagerFactory") EntityManagerFactory entityManagerFactory {
  LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean();
  bean.setPersistenceUnitName("unit-name");
  ...
}
我将实体经理任命为:

@PersistenceUnit
EntityManager entityManager;
在我的@Test中,我连续两次呼叫:

entityManager.createQuery(sql, MyClass.class);
令人惊讶的是,大多数情况下测试都是成功执行的,但有时
entityManager
在第二次调用
createQuery()
时关闭,然后我得到一个:

PSQLException: The connection has been closed.

它并不是说entitymanager已关闭,而是告诉您连接已关闭。这是完全不同的事情。您的测试是事务性的吗?它不是事务性的。应该是吗?如果你想要一个正确的
EntityManager
,它可能应该是“是”。你所说的“正确的”
EntityManager
是什么意思?如果我在事务中不使用连接,连接是否会自动关闭?我的意思是,要执行de first查询,我不需要“打开”连接,如果我不显式地执行,为什么它会自动关闭。您得到的
EntityManager
是一个作用域代理。它将被注入测试,没有
@Transactional
,我怀疑它适合一次使用。使用
@Transactional
它将在整个事务期间打开,即测试方法。