尝试通过 Spring、JPA 和 Java 运行 JUnit 测试时,我收到以下错误消息:
“无法初始化代理 - 没有会话”
这些测试是针对域类的(我们称之为 FirstDomainClass)。FirstDomainClass 类有许多字段,包括一个以多对一关系链接到另一个域类的字段:
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "SECOND_DOMAIN_CLASS")
private SecondDomainClass secondDomainClass;
我发现我必须使用 FetchType.EAGER,否则当我检索 FirstDomainClass 的实例时,不会填充 SecondDomainClass 对象。
FirstDomainClass 的 DAO 实现类的每个方法都以 @Transactional 注释为前缀:
@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public void store(FirstDomainClass firstDomainClass) {
entityManager.persist(firstDomainClass);
}
然后我使用 Spring 将所有内容连接在一起,包括我的 DAO 实现的 bean 定义,然后将其 @Autowired 到我的 JUnit 类中。测试类通过@Before 方法在数据库中创建一些数据,然后使用@After 方法将其清除。
该类以
@RunWith(SpringJUnit4ClassRunner.class)
@TransactionConfiguration(defaultRollback = false)
@ContextConfiguration(locations = { ... list of config files... })
...测试看起来像这样:
@Test
public void testStore() {
SecondDomainClass second = secondDomainClassDao.get(... object created in @Before method... );
FirstDomainClass first = new FirstDomainClass();
first.setSecondDomainClass(second);
... other setting...
firstDomainClassDao.store(first);
FirstDomainClass newFirst = firstDomainClassDao.get(... criteria to retrieve object created by store()... );
... assertions here...
}
当测试作为自动构建过程的一部分运行时,它会失败并显示上面详述的消息。堆栈跟踪标识在访问 SecondDomainClass 对象的主键时发生错误。
版本:Java 1.7 / JUnit 4.10 / JPA 2 / Spring 3.2.2 / Hibernate 4.1.7
非常感谢您的任何帮助。