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

Spring 由@Transactional注释的单元测试类以及在hibernate中分离/逐出的含义,spring,hibernate,transactions,junit4,dozer,Spring,Hibernate,Transactions,Junit4,Dozer,我正在努力解决一个问题,在hibernate文档、源代码和S/O中都找不到合适的解决方案,甚至找不到原因 我有一个带有DAO服务RPC层的spring/hibernate应用程序,其中DAO为RPC提供hibernate实体和服务DTO。因此,我正在将Dozer实体映射转换为服务方法中的DTO,并将DTO映射回服务方法中的实体 映射如下所示非完全方法,检查ommited: @Transactional public updateAuthor(Author author) { Author

我正在努力解决一个问题,在hibernate文档、源代码和S/O中都找不到合适的解决方案,甚至找不到原因

我有一个带有DAO服务RPC层的spring/hibernate应用程序,其中DAO为RPC提供hibernate实体和服务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.unUniqueObjectException:具有相同标识符值的不同对象已与会话关联,但实体上的@Version number并没有正确递增,就好像父单元测试TX仍然保持不变一样

当我删除测试类注释时,映射抛出org.hibernate.LazyInitializationException:failed to lazy initialization一个集合-这本身就有意义,因为该实体已从会话中分离。我不明白的是,为什么在对测试类进行注释时不抛出这个异常。据我所知,在这两种情况下,实体都与当前会话分离

我的另一个问题是——假设实体的行为正确——如何避免在单元测试中遗漏此类错误,并避免测试出血,就像看起来的那样,这种类型的错误只在未注释的测试类中出现

谢谢大家!

JUnit4,Spring 4.0.2.RELEASE,Hibernate 4.3.1.Final