Hibernate多表操作&级联&外键维护

  • Hibernate的一对多关联映射

  • Hibernate的多对多关联映射

 

数据库表与表之间的关系:一对多,多对多,一对一

一对多:一个部门对应多个员工,一个员工只能属于一个部门。一个客户对应多个联系人,一个联系人只能属于一个客户

一对多建表:在多的一方创建外键。

多对多:一个学生可以选择多门课程,一门课程可以被多个学生选择。一个用户可以选择多个角色,一个角色可以被多个用户选择。

多对多建表:创建中间表。中间表至少有两个字段分别作为外键指向多对多双方的主键。

一对一(了解):

一般可以建成一张表。

一个公司只能有一个注册地址,一个注册地址只能被一个公司注册。

建表原则:

唯一外键对应,外键加约束unique来保证一对一

主键对应

 

 

表关系配置:

一对多关系的配置:多的一方放一的一方的对象,一的一方放多的一方的集合,双向配置,可以双向查询。

表架构:

实体类配置:

 

映射文件配置:

多的一方:

 

一的一方:

 测试:

 

Hibernate一对多相关操作:

一对多的级联操作:

级联:是否会同时操作其关联的对象。级联室友方向性的,操作一的一方的时候是否会操作多的一方;操作多的一方是否会操作一的一方

级联保存更新

保存客户级联联系人,操作的主体是客户,需要在Customer.hbm.xml中进行配置

保存联系人级联客户

 级联保存或更新:保存联系人级联客户,操作的主体是联系人,需要在LinkMan.hbm.xml中进行配置

测试对象导航:

级联删除:

 删除一方,将另一方的数据也一并删除

删除客户级联删除联系人:没有设置级联删除,默认情况:Hibernate修改了联系人的外键,使其为null,然后删除客户

修改设置,删除客户就删除联系人:

删除联系人级联删除客户(基本不用)

 

 

将2号联系人原来是1号客户,现在划给2号客户:

双向关联产生多余的SQL语句(客户和联系人的配置里都设置了外键(coloum="lkm_cust_id")),都能维护外键。

解决办法:一的一方放弃外键维护权。关系维护方由多的一方管理。

区分Inverse和Cascade

 

 

Hibernate多对多关系配置:

其实可以使用两个一对多,利用中间表模拟多对多的关系

多对多建立双向关系时,因为两个字段都能插入中间表,造成重复,让被动方放弃外键维护权。

 

 

建表:用户角色和中间表

配置:

domain:

hbm:

基本操作测试:

 

 

多对多级联操作:

级联保存:先让被级联的一方放弃维护权

    @Test
    /**
     * 多对多级联保存,保存用户级联保存角色
     */
    public void demo2(){
        
        //创建2用户3角色
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        
        User user1 = new User();
        user1.setUser_name("脑袋1");
        Role role1 = new Role();
        role1.setRole_name("研发部");
        
        //设置双向关联关系
        user1.getRoles().add(role1);

        //保存操作:多对多建立双向关系,一方放弃关系。因为两个字段都能插入中间表造成重复,被动方放弃外键维护权
        session.save(user1);
        transaction.commit();
    }
    @Test
    /**
     * 多对多级联保存,保存角色级联用户
     */
    public void demo3(){
        
        //创建2用户3角色
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        
        User user1 = new User();
        user1.setUser_name("脑袋3");
        Role role1 = new Role();
        role1.setRole_name("研发部");
        
        //设置双向关联关系
        user1.getRoles().add(role1);
        role1.getUsers().add(user1);
        
        //保存操作:多对多建立双向关系,一方放弃关系。因为两个字段都能插入中间表造成重复,被动方放弃外键维护权
        session.save(role1);
        transaction.commit();
    }

 

级联删除(基本不用):

删除用户级联删除角色,配置用户cascade:delete

 

多对多其他操作:

  • 给用户选择角色
  • 给用户改选角色
  • 给用户删除角色

posted @ 2019-01-22 22:31  IslandZzzz  阅读(805)  评论(0编辑  收藏  举报