由@Transactional注释的单元测试类以及在休眠中分离/逐出的含义

时间:2014-03-11 09:39:54

标签: spring hibernate transactions junit4 dozer

我正在努力解决一个问题我无法在hibernate docs,sources和S / O中找到正确的解决方案甚至原因。

我有带有DAO-Service-RPC层的spring / hibernate应用程序,其中DAO为RPC提供Hibernate实体和Service DTO。因此我在服务方法中将(通过Dozer映射)实体转换为DTO,并将DTO映射回实体。

映射如下(不是完整方法,检查ommited):

@Transactional
public updateAuthor(Author author) {
    AuthorEntity existingEntity = this.authorDao.findById(author.getId());
    this.authorDao.detach(existingEntity);
    this.authorAssembler.toEntity(author, existingEntity, null);
    this.authorDao.merge(existingEntity);
}

我有@Transactional注释的单元测试类,以避免测试数据流失。现在,我意识到,在服务中有一些我不明白的东西。

当我的@Transactional注释我的测试类时,调用detach()似乎有效(即Hibernate没有报告 org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象是已经与会话相关联,但实体上的@Version数字没有正确递增(就像父(单元测试))TX仍然保持不变。

当我删除我的测试类注释时,映射抛出 org.hibernate.LazyInitializationException:无法懒惰地初始化集合 - 这对它自己有意义,因为实体与会话分离。我不明白的是,为什么在注释测试类时不会抛出此异常。据我了解,在两种情况下,实体都与当前会话分离。

我的另一个问题是 - 假设实体行为正常 - 如何避免在单元测试中遗漏此类错误并避免测试出血,因为它似乎是这种类型的错误仅表现出来没有注释的测试类。

谢谢!

(JUnit4,Spring 4.0.2.RELEASE,Hibernate 4.3.1.Final)

0 个答案:

没有答案