爲什麼不簡單地在主實體的構造函數中創建它,並設置cascade =堅持關係?
@Entity
public class Order {
@OneToMany(mappedBy = "order", cascade=CascadeType.PERSIST)
private List<Invoice> invoices = new ArrayList<Invoice>();
public Order() {
Invoice i = new Invoice();
i.setOrder(this);
this.invoices.add(i);
}
// ...
}
編輯:
爲了避免每個訂單的構造函數被調用時創建一個新的發票(通過JPA,例如),你可以使用這種代碼:
@Entity
public class Order {
@OneToMany(mappedBy = "order", cascade=CascadeType.PERSIST)
private List<Invoice> invoices = new ArrayList<Invoice>();
/**
* Constructor called by JPA when an entity is loaded from DB
*/
protected Order() {
}
/**
* Factory method; which creates an order and its default invoice
*/
public static Order createOrder() {
Order o = new Order();
Invoice i = new Invoice();
i.setOrder(o);
o.invoices.add(i);
}
// ...
}
如果該訂單在被工廠方法實例化後仍然存在,那麼發票也將持續存在(感謝級聯)。如果訂單沒有保存,那麼它將在某個時間點被垃圾收集,並且它的默認invoide也是。
「創造」你的意思是「堅持」? – MRalwasser 2011-02-28 12:03:04
@MRalwasser:是的。 – 2011-02-28 12:24:49
這樣做似乎沒有標準化的方式:從JPA 1.0規範:'「一般來說,可移植應用程序不應調用EntityManager或查詢操作, 訪問其他實體實例,或修改生命週期回調方法中的關係。 。也許你可以使用@JB Nizet所說的解決方案。 – MRalwasser 2011-02-28 12:53:24