如下是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