2012-03-27 77 views
0

我正在編寫一個Web應用程序(Tomcat 7),因此沒有JTA,並且想要顯示項目列表,包括與JSF頁面中每個項目關聯的任務。在JSF中使用實體

有2個實體 - 包含任務集合的項目。從我的Managed Bean中,我調用一個方便的方法來檢索所有活動的項目,然後在此項目集合上進行迭代(ui:repeat),並希望顯示每個項目的任務。當我嘗試這樣做時,我得到一個持久性異常,因爲持久性上下文不在範圍之內。

沒有創建項目和任務的支持bean,也沒有使用擴展上下文我有什麼其他選項。

回答

0

讓您方便的方法也取任務,例如通過在查詢中加入該關聯?如果任務已經加載,JPA在訪問集合時將不需要獲取它們。

編輯:JPA 2.0 specification寫入在第4.4.5.3:

甲FETCH JOIN使得能夠締合或元素集合作爲一個查詢的執行的副作用的取出。

的語法要抓取聯接是

fetch_join ::= [ LEFT [OUTER] | INNER ] JOIN FETCH join_association_path_expression 

由FETCH JOIN子句的右側引用必須是關聯或元件的集合,從該返回爲一個實體或嵌入引用的關聯查詢的結果。

不允許爲FETCH JOIN子句右側引用的對象指定標識變量,因此對隱式提取的實體或元素的引用不能出現在查詢的其他位置。

以下查詢返回一組部門。作爲副作用,還會檢索這些部門的相關員工,即使他們不是顯式查詢結果的一部分。由於獲取連接而檢索的對象的持久狀態或關係字段或屬性的初始化由該類的元數據確定 - 在本示例中爲Employee實體 類。

SELECT d 
FROM Department d LEFT JOIN FETCH d.employees 
WHERE d.deptno = 1 

甲取加入了同一連接的語義相應的內或外連接,不同之處在於上的連接操作的右手側所指定的相關對象未在查詢結果返回的或以其他方式中引用查詢。因此,例如,如果部門1有五名員工,則上述查詢將返回五個對部門1實體的引用。

不得在子查詢的FROM子句中使用FETCH JOIN構造。

+0

我該如何編寫查詢以便JPA加載相關數據?現在我的查詢只是「SELECT p FROM project p」。 – semiintel 2012-03-28 09:40:13

+0

我的答案現在包含規範的相關部分,根據您的需求調整其包含的示例應該很簡單。 – meriton 2012-03-28 19:54:46

+0

太棒了,實際上只是在閱讀文章。謝謝你回來更新答案。 – semiintel 2012-03-28 20:28:30

0

手動打開EntityManager(使用工廠)並啓動事務,然後提交併關閉實體管理器。

但是,這不是一個很好的選擇 - 看看像CDI,接縫或Spring來管理事務和會話你(如果你不希望使用EJB3)

1

經過一番更多的思考和研究,我已經回過頭來正確描述我所處的情況,然後也提供瞭解決問題的方法。

發生的事情是Project實體具有指定爲Lazy Loaded的任務關係。 JPA使用代理對象在請求獲取數據之前等待集合的請求。這成爲一個問題,因爲我們試圖在Persistent上下文分離實體後訪問信息。

分辨率:

觸發延遲加載 - 儘管持久性上下文還是在範圍上調用集合getter和任何其他的方法你想的數據,這觸發了對數據加以取出,並添加該實體。

使提取類型Eager - 查看使用延遲加載並將提取類型更改爲渴望的原因。 「FetchType.EAGER」

Fetch Joints - 將關聯添加爲與查詢一起提取的JP QL的一部分。這優化了查詢和關聯在一次調用中加載,同時仍然只返回單個實體。 「SELECT p FROM Project p LEFT JOIN FETCH p.tasks」

希望這可以幫助下一個人找到解決方案。

相關問題