我有一個使用JPA2/Hibernate和Spring @Transactional的JSF2應用程序。 UI中沒有@Transactional語句(支持bean),僅在服務層中。 (我在DAO中使用@Transactional(propagation = Propagation.MANDATORY)來確保每次調用都發生在一個事務中。)它的一切都很好,除了...爲什麼實體管理器需要清除()? - Spring3 @Transactional,JPA2/Hibernate3
當我打開並更新實體時事務服務方法,有時候檢索的實體是舊的。無關緊要的是它在同一個會話中是同一個用戶,偶爾JPA的「read」方法返回已經被(應該)已經被替換的陳舊實體。這難倒了我很長一段時間,但事實證明這是由實體管理器中的緩存引起的。 DAO用@Repository註釋,所以注入的EntityManager正在被重用。我曾預料當交易完成時,實體經理會自動清除。但事實並非如此。實體管理器通常會返回正確的值,但通常會返回並返回早期事務中的舊事務。
作爲一種解決方法,我在DAO讀取方法中添加了策略entityManager.clear()語句,但這很醜陋。實體管理員應在每次交易後清除。
有沒有人遇到過這個?有沒有合適的解決方案?每次交易後,實體經理能否被清除?
非常感謝。
我使用:org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean和org.springframework.orm.jpa.JpaTransactionManager
我想確保如果直接在現有事務之外調用DAO方法之一,則拋出異常。 DAO絕不能開始交易。我認爲這就是@Transactional(propagation = Propagation.MANDATORY)會做的事情。 – John
不應該直接調用DAO。服務層訪問DAO層。控制器/端點應該訪問服務層。那麼爲什麼要考慮直接調用DAO。服務層將調用DAO。 –
如果僅將@Transactional添加到DAO中,即沒有傳播= Propagation.MANDATORY,則它的行爲方式也是相同的。 –