hibernate框架cascade和inverse的区别(十六)

1. cascade用来级联操作(保存、修改和删除)

2. inverse用来维护外键的

一、只配置cascade="save-update"

1.1 配置

只在customer.hbm.xml中配置cascade="save-update"


1.2 测试代码

	/**
	 * cascade和inverse的区别
	 */
	@Test
	public void run12() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();

		// 级联保存
		Customer c1 = new Customer();
		c1.setCust_name("meimei");

		// 创建2个联系人
		Linkman l1 = new Linkman();
		l1.setLkm_name("xiongda");
		Linkman l2 = new Linkman();
		l2.setLkm_name("xionger");

		// 单向关联
		c1.getLinkmans().add(l1);
		c1.getLinkmans().add(l2);

		// 保存数据
		session.save(c1);

		tx.commit();
	}

1.3 运行效果

customer表中有一条数据

linkman表中有两条数据,并且有外键

看sql:

log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hibernate: 
    insert 
    into
        cst_customer
        (cust_name, cust_user_id, cust_create_id, cust_source, cust_industry, cust_level, cust_linkman, cust_phone, cust_mobile) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        cst_linkman
        (lkm_name, lkm_gender, lkm_phone, lkm_mobile, lkm_email, lkm_qq, lkm_position, lkm_memo, lkm_cust_id) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        cst_linkman
        (lkm_name, lkm_gender, lkm_phone, lkm_mobile, lkm_email, lkm_qq, lkm_position, lkm_memo, lkm_cust_id) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    update
        cst_linkman 
    set
        lkm_cust_id=? 
    where
        lkm_id=?
Hibernate: 
    update
        cst_linkman 
    set
        lkm_cust_id=? 
    where
        lkm_id=?

二、配置inverse="true"

2.1 配置


2.2 测试代码

	/**
	 * cascade和inverse的区别
	 */
	@Test
	public void run12() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();

		// 级联保存
		Customer c1 = new Customer();
		c1.setCust_name("meimei");

		// 创建2个联系人
		Linkman l1 = new Linkman();
		l1.setLkm_name("xiongda");
		Linkman l2 = new Linkman();
		l2.setLkm_name("xionger");

		// 单向关联
		c1.getLinkmans().add(l1);
		c1.getLinkmans().add(l2);

		// 保存数据
		session.save(c1);

		tx.commit();
	}

2.3 运行效果


linkman里面没有外键了

看sql:

log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hibernate: 
    insert 
    into
        cst_customer
        (cust_name, cust_user_id, cust_create_id, cust_source, cust_industry, cust_level, cust_linkman, cust_phone, cust_mobile) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        cst_linkman
        (lkm_name, lkm_gender, lkm_phone, lkm_mobile, lkm_email, lkm_qq, lkm_position, lkm_memo, lkm_cust_id) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        cst_linkman
        (lkm_name, lkm_gender, lkm_phone, lkm_mobile, lkm_email, lkm_qq, lkm_position, lkm_memo, lkm_cust_id) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?)


三、最终方案

在一方配置inverse="true",在多方配置cascade="save-update"

3.1 配置



3.2 测试代码

	/**
	 * save的最终方案,开发中就这么用
	 */
	@Test
	public void run13() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();

		// 级联保存
		Customer c1 = new Customer();
		c1.setCust_name("meimei");

		// 创建2个联系人
		Linkman l1 = new Linkman();
		l1.setLkm_name("xiongda");
		Linkman l2 = new Linkman();
		l2.setLkm_name("xionger");

		// 单向关联
		l1.setCustomer(c1);
		l2.setCustomer(c1);

		// 保存数据
		session.save(l1);
		session.save(l2);

		tx.commit();
	}

3.3 运行效果


看sql:

log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Hibernate: 
    insert 
    into
        cst_customer
        (cust_name, cust_user_id, cust_create_id, cust_source, cust_industry, cust_level, cust_linkman, cust_phone, cust_mobile) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        cst_linkman
        (lkm_name, lkm_gender, lkm_phone, lkm_mobile, lkm_email, lkm_qq, lkm_position, lkm_memo, lkm_cust_id) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        cst_linkman
        (lkm_name, lkm_gender, lkm_phone, lkm_mobile, lkm_email, lkm_qq, lkm_position, lkm_memo, lkm_cust_id) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?)
源码下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值