2012-07-05 73 views
0

我正在試圖用Vaadin和JPA持久層做一個簡單的概念證明。有沒有一種方法來處理沒有JpaContainer的vaadin和jpa?

我有@OneToMany與fetchType = Lazy關係的Bean,當我嘗試將這個bean的集合添加到我的DAO表中時。我有下一個例外:

Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: common.domain.Bill.detail, no session or session was closed 

有沒有辦法與Vaadin和JPA沒有JPAContainer?

謝謝。

回答

0

您可以使用Bean(Item)容器並在其中添加您的實體。

如果你只是使用一個容器,你不會像JPAContainer那樣有更多的延遲加載。

使用容器的組件仍然從容器中進行延遲加載,但所有對象都保留在容器中。 容器的延遲加載必須由您自己完成。

有關Bean(Item)容器和容器的更多信息,請參閱here

0

我使用lazyquerycontainer插件的EntityContainer類。顧名思義,它支持延遲加載。這只是工作:)

一些示例代碼:

resultsTable = new Table(); 

    resultsTable.setSelectable(true); 
    resultsTable.setCaption("JpaQuery"); 
    resultsTable.setPageLength(40); 
    resultsTable.setImmediate(true); 
    resultsTable.setEditable(false); 
    resultsTable.setWriteThrough(true); 

    container = new EntityContainer<Call>(em, false, true, true, Call.class, 100, new Object[] {"imsi"}, new boolean[] {true}); 

    container.addContainerProperty(LazyQueryView.PROPERTY_ID_ITEM_STATUS, QueryItemStatus.class, QueryItemStatus.None, true, false); 
    container.addContainerProperty("startTime", Date.class, null, true, true); 
    container.addContainerProperty("stopTime", Date.class, null, true, true); 
    container.addContainerProperty("imsi", String.class, null, false, true); 
    container.addContainerProperty("imei", String.class, null, false, true); 
    container.addContainerProperty("callType", Integer.class, null, true, true); 
    container.addContainerProperty("cdpn", String.class, null, true, true); 
    container.addContainerProperty("cgpn", String.class, null, true, true); 
    container.addContainerProperty("status", Integer.class, null, true, true); 
    container.addContainerProperty("mmRelCause", Integer.class, null, true, true); 
    container.addContainerProperty("rrRelCause", Integer.class, null, true, true); 

    resultsTable.setContainerDataSource(container); 

    resultsTable.setVisibleColumns(new String[] {"startTime" , "stopTime" , "imsi", "imei", "callType" , "cdpn", "cgpn", "status", "mmRelCause"  , "rrRelCause" }); 
    resultsTable.setColumnHeaders(new String[] {"Start time", "Stop time", "IMSI", "IMEI", "Call Type", "CDPN", "CGPN", "Status", "MM Release Cause", "RR Release Cause"}); 

    resultsTable.setColumnCollapsingAllowed(true); 
    resultsTable.setColumnCollapsed("mmRelCause", true); 
    resultsTable.setColumnCollapsed("rrRelCause", true); 

要過濾JQL數據築底,您可以執行filter方法經過過濾字符串和綁定變量的地圖。

... 
whereParameters.put("stopTimeFrom", filterParams.getStopTimeFrom());      
where = "e.startTime >= :stopTimeFrom"; 
... 

container.filter(where, whereParameters); 

如果您預先判斷標準API,則可以使用criteriacontainer

0

這是一箇舊帖子,但...

讓我們看看你的使用情況:
- 您的瀏覽器請求您的應用程序
- 在您的服務器端代碼,您使用EntityManager載入bean(你的bean是在session),但其關係實例(這是懶惰)是代理服務器=>關係實例將僅在首次訪問時加載
- 您的瀏覽器收到響應
- 您單擊向服務器發送請求的按鈕(例如)
- 你嘗試添加/改變一些懶惰的關係
- 由於代理沒有會話(這是創建一個前一個會話,但現在它已不再附加到它會話),它會引發異常

您可以嘗試以下解決方案之一:
1-嘗試合併您的bean(附加bean到當前會話):bean = em.merge(bean);就在添加/更改懶惰關係之前
2-嘗試在第一次加載實體時強制延遲關係的加載:bean.getMyLazyRelationship();
3-在修改實體之前再次加載實體
4-將LAZY改爲EAGER,但它(通常)不是一個好的解決方案

使用容器可能可能不會解決此問題。

希望它有幫助

相關問題