|  | 本文参考《精通JPA与Hibernate:Java对象持久化技术详解》,作者:孙卫琴,清华大学出版社出版 
 以下是removeOrderFromCustomer()方法的代码,它先加载一个Customer对象,然后获得与Customer对象关联的一个Order对象的引用,最后解除Customer和Order对象之间的关系:
 | 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表:
 
 
 | update ORDERS set CUSTOMER_ID=null where ID=2; | 
 如果希望Hibernate自动删除不再和Customer对象关联的Order对象,可以把orphanRemoval属性设为true:
 
 
 | @OneToMany(mappedBy="customer", targetEntity=Order.class,
 orphanRemoval=true,
 cascade=CascadeType.ALL)
 private Set orders = new HashSet();
 | 
 再运行removeOrderFromCustomer()方法时,Hibernate会执行以下SQL语句:
 
 
 | delete from ORDERS where CUSTOMER_ID=2 and ID=2; | 
 当关联双方存在父子关系,就可以把父方的@OneToMany注解的orphanRemoval属性设为true。所谓父子关系,是指由父方来控制子方的持久化生命周期,子方对象必须和一个父方对象关联,而不允许单独存在。如果删除父方对象,应该级联删除所有关联的子方对象;如果一个子方对象不再和一个父方对象关联,应该把这个子方对象删除。
 
 类与类之间是否存在父子关系是由业务需求决定的。通常认为客户(Customer)和订单(Order)之间存在父子关联关系,订单总是由某个客户发出的,因此一条不属于任何客户的订单是没有存在意义的。
 
 而公司(Company)和职工(Worker)之间不存在父子关联关系,当职工从某个公司跳槽后,可以选择一个新的公司,或者处于待业状态。在域模型中,意味着当一个Worker对象和一个Company对象解除关联关系后,Worker对象既可以和一个新的Company对象关联,也可以不再和任何Company对象关联。
 
  
 
 
 
 程序猿的技术大观园:www.javathinker.net
 
 
 
 
 
 [这个贴子最后由 admin 在 2021-10-09 10:43:16 重新编辑]
 | 网站系统异常 
 
 
    
     | 系统异常信息 |  
     | Request URL: 
http://www.javathinker.net/WEB-INF/lybbs/jsp/topic.jsp?postID=3817 
 java.lang.NullPointerException
 
 如果你不知道错误发生的原因,请把上面完整的信息提交给本站管理人员。
 |  |