Hibernate学习(Hibernate的一对多操作)

一对多映射配置(重点)

以客户和联系人为例:客户是一,联系人是多

第一步 创建两个实体类,客户和联系人

第二步 让两个实体类之间互相表示
(1)在客户实体类里面表示多个联系人
一个客户里面有多个联系人

Hibernate学习(Hibernate的一对多操作)_第1张图片
图片1.png

(2)在联系人实体类里面表示所属客户
一个联系人只能属于一个客户

Hibernate学习(Hibernate的一对多操作)_第2张图片
图片1.png

第三步 配置映射关系
(1)一般一个实体类对应一个映射文件
(2)把映射最基本配置完成
(3)在映射文件中,配置一对多关系
在客户映射文件中,表示所有联系人

Hibernate学习(Hibernate的一对多操作)_第3张图片
图片3.png

在联系人映射文件中,表示所属客户

Hibernate学习(Hibernate的一对多操作)_第4张图片
图片4.png

第四步 创建核心配置文件,把映射文件引入到核心配置文件中

图片5.png

一对多级联保存

  1. 添加客户,为这个客户添加一个联系人
    (1)复杂写法:
public void testAddDemo1() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {
            //得到sessionFactory
            sessionFactory = HibernateUtils.getSessionFactory();
            //得到session
            session = sessionFactory.openSession();
            //开启事务
            tx = session.beginTransaction();
            
            // 添加一个客户,为这个客户添加一个联系人
            //1 创建客户和联系人对象
            Customer customer = new Customer();
            customer.setCustName("传智播客");
            customer.setCustLevel("vip");
            customer.setCustSource("网络");
            customer.setCustPhone("110");
            customer.setCustMobile("999");
            
            LinkMan linkman = new LinkMan();
            linkman.setLkm_name("lucy");
            linkman.setLkm_gender("男");
            linkman.setLkm_phone("911");
            
            //2 在客户表示所有联系人,在联系人表示客户     
            // 建立客户对象和联系人对象关系
            //2.1 把联系人对象 放到客户对象的set集合里面
            customer.getSetLinkMan().add(linkman);
            //2.2 把客户对象放到联系人里面
            linkman.setCustomer(customer);
            
            //3 保存到数据库
            session.save(customer);
            session.save(linkman);
            
            //提交事务
            tx.commit();

        }catch(Exception e) {
            tx.rollback();
        }finally {
            session.close();
            //sessionFactory不需要关闭
            sessionFactory.close();
        }
    }

(2)简化写法
一般根据客户添加联系人
第一步 在客户映射文件中进行配置
在客户映射文件里面set标签进行配置

图片6.png

第二步 创建客户和联系人对象,只需要把联系人放到客户里面就可以了,最终只需要保存客户就可以了

public void testAddDemo2() {
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {
            //得到sessionFactory
            sessionFactory = HibernateUtils.getSessionFactory();
            //得到session
            session = sessionFactory.openSession();
            //开启事务
            tx = session.beginTransaction();
            // 添加一个客户,为这个客户添加一个联系人
            //1 创建客户和联系人对象
            Customer customer = new Customer();
            customer.setCustName("百度");
            customer.setCustLevel("普通客户");
            customer.setCustSource("网络");
            customer.setCustPhone("110");
            customer.setCustMobile("999");
        
            LinkMan linkman = new LinkMan();
            linkman.setLkm_name("小宏");
            linkman.setLkm_gender("男");
            linkman.setLkm_phone("911");
            //2 把联系人放到客户里面
            customer.getSetLinkMan().add(linkman);
            //3 保存客户
            session.save(customer);
            
            //提交事务
            tx.commit();
        }catch(Exception e) {
            tx.rollback();
        }finally {
            session.close();
            //sessionFactory不需要关闭
            sessionFactory.close();
        }
    }

一对多级联删除

  1. 删除某个客户,把客户里面所有的联系人删除
  2. 具体实现
    第一步 在客户映射文件set标签,进行配置
    (1)使用属性cascade属性值 delete
1.png

第二步 在代码中直接删除客户
(1)根据id查询对象,调用session里面delete方法删除

Hibernate学习(Hibernate的一对多操作)_第5张图片
2.png
  1. 执行过程:
    (1)根据id查询客户
Hibernate学习(Hibernate的一对多操作)_第6张图片
3.png

(2)根据外键id值查询联系人

Hibernate学习(Hibernate的一对多操作)_第7张图片
4.png

(3)把联系人外键设置为null


Hibernate学习(Hibernate的一对多操作)_第8张图片
5.png

(4)删除联系人和客户

Hibernate学习(Hibernate的一对多操作)_第9张图片
6.png

一对多修改操作(inverse属性)

  1. 让lucy联系人所属客户不是传智播客,而是百度


    Hibernate学习(Hibernate的一对多操作)_第10张图片
    7.png
  2. inverse属性
    (1)因为hibernate双向维护外键,在客户和联系人里面都需要维护外键,修改客户时候修改一次外键,修改联系人时候也修改一次外键,造成效率问题
Hibernate学习(Hibernate的一对多操作)_第11张图片
8.png

(2)解决方式:让其中的一方不维护外键
一对多里面,让其中一方放弃外键维护
一个国家有总统,国家有很多人,总统不能认识国家所有人,国家所有人可以认识总统

(3)具体实现:
在放弃关系维护映射文件中,进行配置,在set标签上使用inverse属性

Hibernate学习(Hibernate的一对多操作)_第12张图片
9.png

你可能感兴趣的:(Hibernate学习(Hibernate的一对多操作))