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

本文详细介绍了在ORM框架中实现一对多和多对多关系的方法,包括实体类的设计、配置文件的编写以及相应的测试代码实现,并探讨了导航查询的概念及其配置。

一.一对多操作
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:极其懒惰-->

转载于:https://www.cnblogs.com/huguangqin/p/7420453.html

dnSpy是目前业界广泛使用的一款.NET程序的反编译工具,支持32位和64位系统环境。它允许用户查看和编辑.NET汇编和反编译代码,以及调试.NET程序。该工具通常用于程序开发者在维护和调试过程中分析程序代码,尤其在源代码丢失或者无法获取的情况下,dnSpy能提供很大的帮助。 V6.1.8版本的dnSpy是在此系列软件更新迭代中的一个具体版本号,代着该软件所具备的功能与性能已经达到了一个相对稳定的水平,对于处理.NET程序具有较高的可用性和稳定性。两个版本,即32位的dnSpy-net-win32和64位的dnSpy-net-win64,确保了不同操作系统架构的用户都能使用dnSpy进行软件分析。 32位的系统架构相较于64位,由于其地址空间的限制,只能支持最4GB的内存空间使用,这在处理大型项目时可能会出现不足。而64位的系统能够支持更大的内存空间,使得在处理大型项目时更为方便。随着计算机硬件的发展,64位系统已经成为了主流,因此64位的dnSpy也更加受开发者欢迎。 压缩包文件名“dnSpy-net-win64.7z”和“dnSpy-net-win32.7z”中的“.7z”示该压缩包采用了7-Zip压缩格式,它是一种开源的文件压缩软件,以其高压缩比著称。在实际使用dnSpy时,用户需要下载对应架构的压缩包进行解压安装,以确保软件能够正确运行在用户的操作系统上。 dnSpy工具V6.1.8版本的发布,对于.NET程序员而言,无论是32位系统还是64位系统用户,都是一个提升工作效率的好工具。用户可以根据自己计算机的操作系统架构,选择合适的版本进行下载使用。而对于希望进行深度分析.NET程序的开发者来说,这个工具更是不可或缺的利器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值