2

尝试通过 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

非常感谢您的任何帮助。

4

0 回答 0