2012-02-05 60 views
4

我正在使用guice-servlet在tomcat和hibernate下以guice-persist運行的環境。我遇到的問題是,當我在一個請求中使用em.getReference()時,加載的代理對象停留在entitymanager緩存中,並可能出現在另一個請求中,我希望從該數據庫完全加載一個對象。用guice-persist自動清除會話

我曾經在EJB3環境中使用hibernate,它是默認行爲。每個新請求都清除實體管理器緩存。對於guice-persist來清除每個請求的會話,這不是一個更安全的行爲嗎?或者至少把它作爲JpaPersistModule的設置?

在hibernate SessionImpl「autoClear」中有一個特殊的標誌,它負責EJB3的行爲。有沒有什麼辦法可以在JpaPersistModule創建新的實體管理器時啓用標誌?

回答

3

解決了這個問題:我創建了一個AOP攔截器來捕獲由JpaPersistService返回的EntityManager。

bindInterceptor(Matchers.subclassesOf(PersistService.class), 
     Matchers.returns(Matchers.identicalTo(EntityManager.class)), 
     new EntityManagerInterceptor() 
); 

內的攔截我越來越SessionImpl通過EntityManagerImpl和設置AUTOCLEAR財產。

public Object invoke(MethodInvocation invocation) throws Throwable { 
    Object result = invocation.proceed(); 
    if (result instanceof EntityManagerImpl) { 
     EntityManagerImpl castedEm = (EntityManagerImpl) result; 
     ((SessionImpl) castedEm.getSession()).setAutoClear(true); 
    } 
    return result; 
} 
+0

請注意,您也可以調用'castedEm.clear()'獲得相同的效果 - 解決陳舊數據的問題。 – condit 2013-02-23 02:37:46