3.2 一对多关系映射的CRUD操作

inverse

package com.itheima.test;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.itheima.domain.Customer;
import com.itheima.domain.LinkMan;
import com.itheima.utils.HibernateUtils;

/*
 * 一对多关系映射的CRUD操作
 * */

public class HibernateDemo1 {
    /*
     * 保存
     * 正常保存:创建一个联系人,关联一个客户
     * */
    @Test
    public void test1() {
        Session s = HibernateUtils.getCurrentSession();
        Transaction tx = s.beginTransaction();
        //查询一个客户
        Customer c1 = s.get(Customer.class, 1L);
        
        //创建一个新联系人
        LinkMan l = new LinkMan();
        l.setLkmName("一对多的联系人");
        
        //建立客户和联系人的关联关系(让联系人知道属于那个客户即可)
        l.setCustomer(c1);
        
        //保存联系人
        s.save(l);
        
        tx.commit();
    }
    
    /*
     * 特殊的情况:
     * 创建一个客户和一个联系人
     * 建立联系人和客户的双向关联关系
     * 使用符合原则的保存
     *      原则:先保存主表实体,再保存从表实体
     * 
     * 保存两条实体应给只有两条insert语句,但是多了一条update语句
     * 
     * 解决办法:让客户在执行操作时,放弃维护关联关系的权力
     * 配置方式:
     *  在Customer的映射配置文件中的set标签上使用inverse属性
     *  inverse含义:是否放弃维护关联关系的权力,false默认值不放弃
     * 
     * 此时保存时产生一级缓存和快照只管自己的
     * */
    @Test
    public void test2() {
        //创建一个客户
        Customer c1 = new Customer();//瞬时态
        c1.setCustName("一对多的客户——2");
        
        //创建一个新联系人
        LinkMan l = new LinkMan();//瞬时态
        l.setLkmName("一对多的联系人_2");
        
        //建立客户和联系人的关联关系(双向)
        l.setCustomer(c1);
        c1.getLinkmans().add(l);
        
        
        Session s = HibernateUtils.getCurrentSession();
        Transaction tx = s.beginTransaction();
        
        
        //保存联系人,要符合原则
//      Hibernate: insert into cst_customer (cust_name, cust_source, cust_industry, cust_level, cust_address, cust_phone) values (?, ?, ?, ?, ?, ?)
//      Hibernate: insert into cst_linkman (lkm_name, lkm_gender, lkm_phone, lkm_mobile, lkm_email, lkm_position, lkm_memo, lkm_cust_id) values (?, ?, ?, ?, ?, ?, ?, ?)
//      Hibernate: update cst_linkman set lkm_cust_id=? where lkm_id=?
        
        s.save(c1);//持久态 有一级缓存和快照
        s.save(l);//持久态 有一级缓存和快照
        
        tx.commit();
    }
}

image.png

image.png

你可能感兴趣的:(3.2 一对多关系映射的CRUD操作)