>>分享孙卫琴的Java技术专稿和著作 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 14970 个阅读者 刷新本主题
 * 贴子主题:  【持久化专题】用orphanRemoval属性映射父子关系 回复文章 点赞(0)  收藏  
作者:sunweiqin    发表时间:2021-05-05 09:59:11     消息  查看  搜索  好友  邮件  复制  引用

本文参考《精通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对象关联。
点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小




程序猿的技术大观园:www.javathinker.net





[这个贴子最后由 admin 在 2021-10-09 10:43:16 重新编辑]
  Java面向对象编程-->Java语言中的修饰符
  JavaWeb开发-->使用Session(Ⅱ)
  JSP与Hibernate开发-->数据库事务的概念和声明
  Java网络编程-->通过JavaMail API收发邮件
  精通Spring-->组合(Composition)API
  Vue3开发-->计算属性和数据监听
  【Vue.js技术专题】路由管理器的基本用法
  【Spring Cloud Alibaba专题】ShardingSphere核心概念
  【Spring Cloud Alibaba专题】GateWay与Nacos整合
  【持久化专题】为什么JPA和Hibernate的持久化方法都抛出运行...
  【Spring专题】Spring MVC是否过时?
  【Spring专题】控制器对象的生命周期
  【Spring专题】@ControllerAdvice注解的用法
  【Spring专题】RestTemplate类与RESTFul风格的请求
  【Spring专题】通过JPA API实现Repository接口
  【持久化专题】映射对象标识符的基本原理
  【持久化专题】@Access注解设定Hibernate访问类的属性的方式
  【JavaWeb专题】Spring MVC创建Web应用范例,轻松入门
  【JavaWeb专题】Tomcat与IIS集成详解
  【Java基础编程专题】用内部类实现回调
  【Java基础编程专题】Java继承的利弊和使用原则
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。