2013-12-12 43 views
0

我已經使用JSF + Spring + JPA創建了示例項目。 我有兩個實體客戶和訂單,客戶可以有多個訂單,因此客戶和訂單之間的映射是@OneToMany。 Customer類是如下OpenEntityManagerInView不能使用JSF

@Entity 
@NamedQueries 
(
    { 
     @NamedQuery(name=Contact.QUERY_FIND_ALL, query="FROM Contact"), 
    } 
) 
public class Customer 
    { 
     public final static String QUERY_FIND_ALL="findAll"; 

     @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY) 
     private List<Order> orders; 

     public List<Order> getOrders() 
     { 
      return orders; 
     } 

     public void setOrders(List<Order> orders) 
     { 
      this.orders = orders; 
     } 
    } 

我查看就像下面

1種情況:

  1. 我們加載所有CUTOMER,並在屏幕上顯示出來,並在 前每個箭頭在一個請求中記錄這種情況。
  2. 現在當最終用戶點擊箭頭時,我們想要顯示客戶的所有訂單 。

    但我得到延遲加載異常,即使我使用OpenEntityManagerInView。

第二個案例:

  1. 如果我同時加載客戶和訂單在一個請求時,它做工精細。

有沒有這樣的事情,如果我們在一個請求中加載父項,我們不能在第二個請求中加載它的惰性關聯?

爲什麼它不在第一種情況下工作,在第二種情況下工作?

更重要的是什麼其他的解決辦法將其存檔?

+1

只有在頁面呈現時,「OpenSessionInViewFilter」僅適用於單個請求會話關閉。現在當你點擊一個箭頭時,原來的會話就不存在了,因此懶惰的加載不起作用。 –

+0

感謝M. Deinum,但是有文件說我們不能在http請求中使用OpenEntityManagerInView? – Vipul

+0

提到的類的javadoc以及這是在視圖中如何打開會話的一般概念。你想要什麼(或多或少)是對話中的開放視角。 –

回答

0

當您在數據訪問層類(如CustomerDAO)你必須讓每個孩子性質的至少一個繞過懶惰的代理,也許是這樣的

public class CustomerDAO{ 

     public Customer getCustomer(String custId){ 
      Customer cust = //your method to retrieve customer 
      List<Order> orders = cust.getOrders(); 
      for(Order ord:orders){ 
        ord.getOrderName(); // you have to get at least one of each child property to bypass lazy proxy 
      } 
     } 
    } 

加載客戶希望它將有助於