Hibernate笔记3--多表操作-导航查询

一.一对多操作

1.构造实体类及编写配置文件:
     一方:

  1        // 一个Customer对应多个linkman
  2          private Set<Linkman> linkmans = new HashSet<>(0);

配置:

  1         <!-- inverse="true"代表放弃外键维护权 -->
  2          <set name="linkmans" inverse="true">
  3                  <!-- 配置从表的外键名 -->
  4              <key column="sys_cust_id"></key>
  5                 <!-- 配置关联方式 -->
  6              <one-to-many class="entity.Linkman"/>
  7          </set>

多方:

  1         // 多个linkman对应一个customer
  2          private Customer customer;

配置:

  1         <!-- 配置关联关系 -->
  2          <many-to-one name="customer" class="entity.Customer" column="sys_cust_id"></many-to-one>

2.测试代码

  1   package demo;
  2
  3     import org.hibernate.Session;
  4      import org.hibernate.Transaction;
  5      import org.junit.Test;
  6
  7     import entity.Customer;
  8      import entity.Linkman;
  9      import utils.HibernateUtils;
 10
 11     //一对多操作
 12     public class demo01 {
 13          @Test
 14          public void test() {
 15              Session cs = HibernateUtils.getCurrentSession();
 16              Transaction tx = cs.beginTransaction();
 17              // 创建一个客户
 18             Customer cust = new Customer();
 19              cust.setCustName("A公司");
 20              // 创建与客户关联的联系人
 21             Linkman man = new Linkman();
 22              man.setLkmName("Jack");
 23              // 保存关系--配置一的一方的set标签的inverse属性的值为true,放弃外键维护权
 24             cust.getLinkmans().add(man);
 25              man.setCustomer(cust);
 26              // 保存
 27             cs.save(cust);
 28              cs.save(man);
 29              // 提交
 30             tx.commit();
 31          }
 32      }
 33 

二.多对多操作

1.构造实体类及编写配置文件:
     多方1-User:

  1       <!-- 配置关联关系 多对多,table代表中间表,cascade表示允许级联操作:all/save-update/delete-->
  2              <set name="roles" table="sys_user_role" cascade="all">
  3                  <!--外键:当前对象在中间表的外键名  -->
  4                  <key column="sys_user_id"></key>
  5                  <!--对方的全限定名,及在中间表的外键名  -->
  6                  <many-to-many class="entity.Role" column="sys_role_id"></many-to-many>
  7              </set>

多方2-Role:

  1 <!-- 配置关联关系 多对多-->
  2              <set name="users" table="sys_user_role" inverse="true">
  3                  <!--外键:当前对象在中间表的外键名  -->
  4                  <key column="sys_role_id"></key>
  5                  <!--对方的全限定名,及在中间表的外键名  -->
  6                  <many-to-many class="entity.User" column="sys_user_id"></many-to-many>
  7              </set>

2.测试代码:

  1  package demo;
  2
  3     import org.hibernate.Session;
  4      import org.hibernate.Transaction;
  5      import org.junit.Test;
  6
  7     import entity.Role;
  8      import entity.User;
  9      import utils.HibernateUtils;
 10
 11     //测试多对多操作
 12     public class demo02 {
 13          @Test
 14          public void testAdd() {
 15              Session cs = HibernateUtils.getCurrentSession();
 16              Transaction tx = cs.beginTransaction();
 17              // 创建一个user
 18              User u = new User();
 19              u.setUserName("Rose");
 20              // 创建一个role
 21              Role r = new Role();
 22              r.setRoleName("painter");
 23              // 维护中间表,配置文件中被动一方放弃维护权
 24             u.getRoles().add(r);
 25              r.getUsers().add(u);
 26              // 保存
 27             cs.save(u);
 28              cs.save(r);
 29              tx.commit();
 30          }
 31
 32
 33           @Test
 34          // 多对多级联操作,多一个配置,少一个保存
 35         public void testCascade() {
 36              Session cs = HibernateUtils.getCurrentSession();
 37              Transaction tx = cs.beginTransaction();
 38              // 创建一个user
 39              User user = new User();
 40              user.setUserName("Jack");
 41              // 创建一个role
 42              Role role = new Role();
 43              role.setRoleName("model");
 44              // 维护中间表,被动一方配置为放弃维护权
 45             user.getRoles().add(role);
 46              role.getUsers().add(user);
 47              // 保存user,user配置级联操作,即user可以操作role
 48              cs.save(user);
 49              // 下一行语句不报错,只是维护了cst_role表格,因为role没有配置级联操作
 50             // cs.save(role);
 51              // 提交事务
 52             tx.commit();
 53          }
 54
 55             @Test
 56          // 给1号用户添加2号角色操作
 57         public void addRole() {
 58              Session cs = HibernateUtils.getCurrentSession();
 59              Transaction tx = cs.beginTransaction();
 60              // 获取1号用户
 61             User user01 = cs.get(User.class, 1L);
 62              // 获取2号角色
 63             Role role02 = cs.get(Role.class, 2L);
 64              // 分配角色
 65             user01.getRoles().add(role02);
 66              // 保存
 67             cs.save(user01);
 68              // 提交
 69             tx.commit();
 70          }
 71
 72             @Test
 73          // 删除1号用户的1号角色
 74         public void delRole() {
 75              Session cs = HibernateUtils.getCurrentSession();
 76              Transaction tx = cs.beginTransaction();
 77              // 获取1号用户
 78             User user01 = cs.get(User.class, 1L);
 79              // 获取1号角色
 80             Role role01 = cs.get(Role.class, 1L);
 81              // 删除1号用户的1号角色
 82             user01.getRoles().remove(role01);
 83              // 保存
 84             cs.save(user01);
 85              // 提交事务
 86             tx.commit();
 87          }
 88
 89             @Test
 90          // 修改1号用户为3号角色
 91         public void changeRole() {
 92              Session cs = HibernateUtils.getCurrentSession();
 93              Transaction tx = cs.beginTransaction();
 94              // 获取1号用户
 95             User user01 = cs.get(User.class, 1L);
 96              // 获取2号角色
 97             Role role02 = cs.get(Role.class, 2L);
 98              // 获取3号角色
 99             Role role03 = cs.get(Role.class, 3L);
100              // 删除1号用户的2号角色
101             user01.getRoles().remove(role02);
102              // 添加3号角色
103             user01.getRoles().add(role03);
104              // 保存
105             cs.save(user01);
106              // 提交事务
107             tx.commit();
108          }
109      }
110 

三.导航查询

概念:比如客户与联系人是一对多的关系,通过查询客户也能查询其对应的联系人,则称为导航查询.导航查询默认为延迟加载;如果使延迟加载失效,则在客户的映射关系文件的set标签内配置lazy属性
   <!-- lazy : 配置查询关联对象的延迟加载
                             true:使用延迟,默认
                             false:不使用延迟
                             extra:极其懒惰-->

时间: 2024-10-31 05:09:44

Hibernate笔记3--多表操作-导航查询的相关文章

【笔记】多表交叉的查询

表3 num taste 1 原味 2 麻辣 3 咸味 表2 dataid numid 1 1 1 3 2 1 表1 id  name 1 花生 2 牛奶 首先controllers 拿到表一的id给mod select   表3.taste FROM 表2 left join 表三 ON 表二.numid = 表三.num WHERE 表二.dataid = 表一.id //查询数据库 $query = $this->db->query($sql); //以数组的形式返回查询结果 retur

Hibernate学习笔记--------1.单表操作

一.hibernate基本开发步骤 1.引入包,官网下载的包,目录\lib\required下的jar都加进去,这里使用的是 hibernate-release-5.2.1.Final 2.编写配置文件hibernate.cfg.xml,可用hibernate Tools自动生成 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3

Hibernate入门(五)hibernate的级联(cascade)表操作

存在的意义 在实际做项目的时候,经常会遇到表与表之间的关联操作,比如一个班级里面有多个学生,一个部门有多个职员,这是一对多的关系,还有例如一个主题有一个作者,这是一对一,等,这时候就必须涉及到表的关联操作 一对多的单项关联 什么意思呢? 比如一个班级里面有多个学生,班级表关联学生表,属于一对多,但是学生表并不关联班级表,这个就属于单项的关联 只能从classes找到student,所以为单项关联 class.hbm.xml中的配置 <set name="students" cas

(十四)Hibernate中的多表操作(4):单向一对一

案例一: 注解方式实现一对一 UserBean.java package bean; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import java

(十三)Hibernate中的多表操作(3):单向多对多

多对多的处理方式是,有一张中间表,中间表保存两个多方之间的关系.首先来看实际应用场景:在之前开发的系统中,应用了基于角色的控制访问,也就是RBAC模型,一个用户可能存在多种角色,一种角色也可能有多个用户,所以用户和角色之间是一个多对多的关系. 案例一:  使用注解方式实现多对多关系 RoleBean.java package bean; import java.io.Serializable; import java.util.HashSet; import java.util.Set; imp

(十二)Hibernate中的多表操作(1):单向多对一

由"多"方可知"一"方的信息,比如多个员工使用同一栋公寓,员工可以知道公寓的信息,而公寓无法知道员工的信息. 案例一: pojo类 public class Department { //公寓类,"一"方 private int id; private String name; //setter和getter方法.... } public class Employee { //员工类,"多"方 ,既然是多对一,多方知道一放的信

Mysql笔记4数据表操作1

1查看表的结构 (1)show create table +数据库名称 (2)desc+数据库名称 2修改表 (1)表中添加列 alter table 数据库名称 add column addr varchar(20)//添加地址列 (2)修改表某列扥类型 alter table 数据库名称 modify column sname varchar(20) (3)修改某一列的名称 alter table 数据库名称 change addr work_add varchar(20) (4)修改表的名

(十一)Hibernate中的多表操作(1):单向一对多

一.单向一对多() 案例一(用XML文件配置): 一个会员(Member)可以有多个订单(Order),加载会员的时候自动加载订单,但是订单无法查看会员信息, public class Member { private String id; private String name; private Integer age; private Set<Order> orders = new HashSet<Order>(); //该Set集合里存放的是"多"方,加载

Hibernate初探之单表映射

http://www.imooc.com/video/7816 1.什么是ORM?为什么使用Hibernate? 对象关系映射:为了少写和底层数据库相关的sql语句,方便程序的维护.修改,提高跨平台性和可扩展性.Hibernate是Java领域内的一款技术成熟稳定的ORM框架 2.Hibernate开发的基本步骤? (1)编写配置文档hibernate.cfg.xml (2)编写实体类.注意:每一个实体类都要与数据库中的一张表一一对应,实体类的编写要遵循JavaBean的要求. (3)生成对应实