2013-05-26 81 views
2

比方說,我有兩個實體:的EclipseLink - 雙向一對多關係

@Entity 
public class Customer implements Serializable { 
    ... 
    @OneToMany(cascade=ALL, mappedBy="customer") 
    public Set<Order> getOrders() { 
     return orders; 
    } 
    ... 
} 

@Entity 
public class Order implements Serializable { 
    ... 
    @ManyToOne 
    @JoinColumn(name="CUST_ID", nullable=false) 
    public Customer getCustomer() { 
     return customer; 
    } 
    ... 
} 

然後,我堅持客戶實體,並在這之後,訂單實體參照以前添加的客戶。 當我從數據庫中檢索該客戶並調用getOrders時,它將返回空集。 這是正常行爲嗎?如果是這樣,當我添加新的Order實體時,我能做些什麼來自動刷新這個集合?

回答

7

Jpa沒有爲您維護關係,因此需要應用程序設置雙向關係的雙方以使它們與數據庫保持同步。當您設置訂單 - >客戶關係時,將訂單添加到訂單列表中,並且如果客戶已分離,則合併它以使所選集合的更改生效。

否則,您需要在事務後使用em.refresh或具有刷新查詢提示的查詢來明確刷新,或者從緩存中逐出客戶。無論哪種方式,它都需要通過維護關係的雙方輕鬆避免的數據庫命中。

+0

我不得不嘗試接收來自EntityManager的使用em.find一個一對多的關係(......)時,這個問題,但總是收到一個空的列表。我始終保持關係是最新的,但從entitymanager我總是收到一個空列表,我目前使用em.refresh(...)填充。我應該在使用em.find(...)時看到不同的行爲嗎? – Ben

+0

本,你將不得不提供更多的細節,因爲我不知道如何調用em.find()來獲得OneToMany關係。如果關係沒有條目,那麼數據庫也沒有它們,緩存的實體是陳舊的(例如,當你只添加到雙向關係的一側,或者在讀入後更新了不同EntityManager中的實體這一個),或者你的映射不正確。如果em.refresh不能解決問題,那麼可能是數據庫沒有你想象的那樣,或者映射不正確。嘗試在問題中發佈詳細信息 – Chris

+0

克里斯,我意識到我不清楚。對不起。這裏是關於我的問題的一個新問題:http://stackoverflow.com/questions/38760611/eclipselink-not-populating-lazy-onetoone-with-nested-lazy-onetomany-relation – Ben

2

如果您從相同的交易中檢索客戶,那麼是的,這是預期的行爲。原因是EntityManager返回它在第一級緩存中的訂單,並且是您自己創建的,而不會爲其訂單集添加任何訂單。這是你的責任,通過維持協會的雙方保持對象圖的一致性:

order.setCustomer(customer); 
customer.addOrder(order);