Hibernate 您所在的位置:网站首页 hibernate多对多关联 Hibernate

Hibernate

2024-07-09 23:49| 来源: 网络整理| 查看: 265

目录

实体类增加关联对象

下面是映射文件:

save相关操作 

正常的保存操作:

级联保存:

外键维护:

查询操作:

delete相关操作:

删除one的一方(customer):

删除many的一方:

级联删除(通常是删除one连带many):

两张表,用户和订单,记录一下一对多和多对一关联映射的实现。

实体类增加关联对象

客户实体类中除了客户自己的属性外,还要加一个orders对象的set集合。

订单实体类除了自己的属性外还要加一个客户对象。

import java.util.HashSet; import java.util.Set; public class Customer { private Integer id;//客户id private String name;//客户名称 //一对多属性描述,一个客户有n个订单 private Set orders = new HashSet(); } public class Order { private Integer id;//订单ID,以后工作中订单ID一般都UUID类型 private String name;//订单名称 private Customer customer;//订单只属性某个客户 } 下面是映射文件:

customer映射文件中要映射Set集合的Order,客户对于订单是一对多使用one-to-many,class属性指向many的一方Orders类,另外声明key指的是两张表的外键。

Orders映射文件要加customer类的映射,使用many-to-one,class属性指向one的一方也就是customer类,column属性指的也是外键。

save相关操作 

两张表都要保存时可以按步骤报错也可以通过级联保存简化操作。

正常的保存操作:

关联插入注意要先插入主表的数据,后插入从表数据。

@Test public void test1(){ Session session = HibernateUtils.openSession(); session.getTransaction().begin(); //保存数据 //1.创建客户对象 Customer customer = new Customer(); customer.setName("胡歌"); //2.创建两个订单 Order order1 = new Order(); order1.setName("内存条"); Order order2 = new Order(); order2.setName("红内库"); //3.维护订单与客户关系 order1.setCustomer(customer); order2.setCustomer(customer); //4.客户拥有订单 customer.getOrders().add(order1); customer.getOrders().add(order2); //5.保存数据 session.save(customer);//保存完,客户有id session.save(order1); session.save(order2); session.getTransaction().commit(); session.close(); } 级联保存:

在多的一方的映射文件里set标签内设为cascade属性,保存操作可以设置为save或save-update。后只需要保存一的一方数据,多的一方数据会根据对象数据关联保存到数据库。如下操作不需要单独保存订单也可以实现客户和订单都被保存。

如果需要配置多项,使用逗号分隔。

@Test public void test1(){ Session session = HibernateUtils.openSession(); session.getTransaction().begin(); //保存数据 //1.创建客户对象 Customer customer = new Customer(); customer.setName("刘教练"); //2.创建两个订单 Order order1 = new Order(); order1.setName("内存条"); Order order2 = new Order(); order2.setName("红内库"); //3.维护订单与客户关系 order1.setCustomer(customer); order2.setCustomer(customer); //4.客户拥有订单 customer.getOrders().add(order1); customer.getOrders().add(order2); //5.保存数据 session.save(customer);//保存完,客户有id /* session.save(order1); session.save(order2);*/ session.getTransaction().commit(); session.close(); }

 

 

外键维护:

默认情况下双方都会维护外键,会导致update语句产生,通常一对多的情况下,设置one的一方放弃外键维护。在set上配置inverse=”true”,把维护交给多的一方。

查询操作:

一对多的映射,查到一的一方,可以直接取关联的多的一方的数据。

例如查到某个客户,就可以直接取到他的所有订单,订单查询是在getOrders()方法执行时才根据客户的id去订单表里查询的。不用的话就不会查询。

@Test public void test2(){ Session session = HibernateUtils.openSession(); //查询一对多 /** * 默认情况,只有当使用Customer的orders的数据,会执行SQL查询 */ //1.查询3的客户 Customer customer = (Customer) session.get(Customer.class,3); //2.获取名字 System.out.println("客户的名字:" + customer.getName()); //3.获取这个客户的所有定单 Set orders = customer.getOrders(); for(Order o : orders){ System.out.println("购买订单名称:" + o.getName()); } session.close(); }

 

delete相关操作: 删除one的一方(customer):

      一对多的删除,如果删除的是一的一方,要先解除外键关联也就是订单中客户ID,否则会报错。

把关联的orders集合中每个orders的客户设为null,事务提交时就会执行update把order表中数据的外键设为空,解除掉了关联。

@Test public void test3(){ Session session = HibernateUtils.openSession(); //一对多的删除 session.getTransaction().begin(); //1.查询3的客户 Customer customer = (Customer) session.get(Customer.class,3); //如果要删除一对多,把order的约束去除 for(Order order : customer.getOrders()){ order.setCustomer(null);//会执行update语句,把数据库的外键设置为null } //2.删除客户 session.delete(customer); session.getTransaction().commit(); session.close(); } 删除many的一方:

直接删除,没有特别之处。 

级联删除(通常是删除one连带many):

如果要删除双方,也可以通过级联设置来简化操作。与级联保存类似,在多的一方cascade属性设为delete,代码实现只要删除客户,订单也会被删除。其删除的逻辑是先查到关联订单,再删除订单,最后删除客户。仍然遵循存在外键先解除外键的原则



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有