孫衛琴的《精通JPA與Hibernate》的讀書筆記:用orphanRemoval屬性映射父子關係

如下是removeOrderFromCustomer()方法的代碼,它先加載一個Customer對象,而後得到與Customer對象關聯的一個Order對象的引用,最後解除Customer和Order對象之間的關係:java

tx = entityManager.getTransaction(); 
tx.begin(); //開始一個事務

//加載Customer對象
Customer customer=entityManager.find(Customer.class,customerId);

//得到與Customer對象關聯的一個Order對象的引用
Order order=customer.getOrders().iterator().next();
 
//解除Customer對象和Order對象的關聯關係
customer.getOrders().remove(order);
order.setCustomer(null);

tx.commit();

對於映射Customer類的orders屬性的@OneToMany註解,它還有一個orphanRemoval屬性,它的默認值爲false。當orphanRemoval屬性爲默認值false,當Hibernate解除Customer和Order對象之間的關係時,會執行如下語句,使得ORDERS表中的相應記錄再也不參照CUSTOMERS表:markdown

update ORDERS set CUSTOMER_ID=null where ID=2;

若是但願Hibernate自動刪除再也不和Customer對象關聯的Order對象,能夠把orphanRemoval屬性設爲true:app

@OneToMany(mappedBy="customer",
             targetEntity=Order.class,
             orphanRemoval=true,
             cascade=CascadeType.ALL)
  private Set<Order> orders = new HashSet<Order>();

再運行removeOrderFromCustomer()方法時,Hibernate會執行如下SQL語句:ide

delete from ORDERS where CUSTOMER_ID=2 and ID=2;

當關聯雙方存在父子關係,就能夠把父方的@OneToMany註解的orphanRemoval屬性設爲true。所謂父子關係,是指由父方來控制子方的持久化生命週期,子方對象必須和一個父方對象關聯,而不容許單獨存在。若是刪除父方對象,應該級聯刪除全部關聯的子方對象;若是一個子方對象再也不和一個父方對象關聯,應該把這個子方對象刪除。atom

類與類之間是否存在父子關係是由業務需求決定的。一般認爲客戶(Customer)和訂單(Order)之間存在父子關聯關係,訂單老是由某個客戶發出的,所以一條不屬於任何客戶的訂單是沒有存在乎義的。spa

而公司(Company)和職工(Worker)之間不存在父子關聯關係,當職工從某個公司跳槽後,能夠選擇一個新的公司,或者處於待業狀態。在域模型中,意味着當一個Worker對象和一個Company對象解除關聯關係後,Worker對象既能夠和一個新的Company對象關聯,也能夠再也不和任何Company對象關聯。
在這裏插入圖片描述code

相關文章
相關標籤/搜索