這是一個很好的舊討論的時候了。大約一年前,我設計了一個web應用程序,它在一家公司的測試系統中進行管理。這意味着很多設置,設備,讀數,設置 - 你的名字 - 是持久的。這也意味着,例如當一個用戶想要加載一個包含所有測試的表格時,我真的不想從數據庫中加載150萬個讀數。java web-app中的數據訪問層
所以當然我使用了延遲加載。當用戶選擇測試並想查看結果時,所有結果都從數據庫中加載。 當時我用Eclipselink。這很有效 - 據我所知,因爲Eclipselink在嘗試獲取用lazy fetchtype註釋的內容時會自動打開一個新會話。
現在,一歲和更聰明,我正在做一些重構。一個重大的變化是離開Eclipselink Hibernate(也很好學習新東西)。突然間,我收到了很好的舊LazyInitializationException。是的,我現在看到我的DAO結構不起作用。
/**
* The Class DAO which all the other EntityDAOS extend
*/
public class DAO {
/** The entitymanager. */
private EntityManager entitymanager;
/**
* Gets the entitymanager
*
* @return the manager
*/
public EntityManager getManager(){
entitymanager = FactoryMaker.getFactory().createEntityManager();
entitymanager.getTransaction().begin();
entitymanager.flush();
entitymanager.clear();
return entitymanager;
}
/**
* Commit and clear the manager.
*/
public void Close(){
if(entitymanager.isOpen()){
if(entitymanager.getTransaction().isActive()){
entitymanager.getTransaction().commit();
entitymanager.clear();
}
entitymanager.close();
}
}
@Override
protected void finalize() throws Throwable {
super.finalize();
}
}
從下面的保存示例中可以清楚地看到,會話立即關閉。
public void SaveSomething(Something t){
EntityManager manager = getManager();
manager.merge(t);
manager.flush();
Close();
}
所以這顯然不是一個好的解決方案。 現在 - 在你的看法 - 爲web應用程序創建數據訪問層的最佳方式是什麼?需要延遲加載,數據庫中的數據是整個系統的基礎?