【发布时间】:2012-09-10 14:51:27
【问题描述】:
我有一个使用 JPA2/Hibernate 和 Spring @Transactional 的 JSF2 应用程序。 UI(支持 bean)中没有 @Transactional 语句,只有在服务层中。 (我在 DAO 中使用 @Transactional(propagation=Propagation.MANDATORY) 来确保每次调用都发生在事务中。)除了...
当我通过事务服务方法打开和更新实体时,有时检索到的实体是旧的。在同一个会话中它是同一个用户并不重要,偶尔,JPA“读取”方法会返回已经(应该)已经被替换的旧实体。这让我困惑了很长时间,但事实证明这是由实体管理器中的缓存引起的。 DAO 使用 @Repository 进行注释,因此注入的 EntityManager 正在被重用。本来以为交易完成后,实体管理器会自动清零。但事实并非如此。通常实体管理器会返回正确的值,但通常它会返回并返回较早交易中的旧值。
作为一种解决方法,我在 DAO 读取方法中添加了战略 entityManager.clear() 语句,但这很难看。 entityManagers 应该在每次交易后被清除。
有人经历过吗?有合适的解决方案吗?实体管理器可以在每次交易后清零吗?
非常感谢。
我正在使用:org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean 和 org.springframework.orm.jpa.JpaTransactionManager
【问题讨论】:
标签: jpa-2.0 spring-3 transactional hibernate3