我正在努力解决一个问题我无法在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)