孙卫琴的《精通JPA与Hibernate》的读书笔记:用orphanRemoval属性映射父子关系

这篇博客详细解释了在Hibernate和JPA中,`orphanRemoval`属性如何影响父子关系的映射。通过示例展示了当设置`orphanRemoval=true`时,如何自动删除不再关联的子对象,以及在客户(Customer)与订单(Order)这样的父子关系中,这一特性的适用场景。反之,在公司(Company)和职工(Worker)的关系中,由于不具有父子关联特性,`orphanRemoval`的使用则有所不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是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<Order> orders = new HashSet<Order>();   

再运行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对象关联。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java技术集锦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值