学习日志——2019/08/20

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44757417/article/details/99873884

一对多的级联操作

级联删除

  • 级联删除:
    • 删除一边的时候,同时将另一方的数据也一并删除。
删除客户级联删除联系人
	 <set name="linkMans" cascade="save-update,delete">
@Test
	/**
	 * * 级联删除:
	 * * 删除客户联系人,删除的主体是客户,需要在Customer.hbm.xml中配置
	 * * <Set name ="LinkMans" cascade="delete">
	 */
	public void demo5() {
		Session session=HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		/*
		 * //没有设置级联删除,默认情况:修改联系人的外健,删除客户 Customer customer=session.get(Customer.class,
		 * 1l); session.delete(customer);
		 */
		//先查询再删除
		Customer customer =session.get(Customer.class, 2l);
		session.delete(customer);
		
		
		tx.commit();
	}
	
删除联系人级联删除客户(基本不用)
 <many-to-one name="Customer" cascade="save-update,delete" class="HibernateDemo01.Customer" column="lkm_cust_id"></many-to-one>
    
@Test
	/**
	 * * 级联删除:
	 * * 删除联系人删除客户,删除的主体是客户,需要在Customer.hbm.xml中配置
	 * * <Set name ="LinkMans" cascade="delete">
	 */
	public void demo6() {
		Session session=HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		/*
		 * //没有设置级联删除,默认情况:修改联系人的外健,删除客户 Customer customer=session.get(Customer.class,
		 * 1l); session.delete(customer);
		 */
		//先查询再删除
		//删除客户,同时删除联系人
		LinkMan linkMan=session.get(LinkMan.class, 3l);//查询
		session.delete(linkMan);
		
		
		tx.commit();
	}
一对多设置了双向关联产生多余的SQL语句

在这里插入图片描述

@Test
	/**
	 *  * 将2号联系人原来归1号用户,现在改为2号用户
	 */
	public void demo07() {
		Session session=HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		//查询2号联系人
		LinkMan linkMan = session.get(LinkMan.class, 2l);
		//查询2号联系人
		Customer customer=session.get(Customer.class, 2l);
		
		//双向关联、
		linkMan.setCustomer(customer);
		customer.getLinkMans().add(linkMan);
		
	
		tx.commit();
	}
  • 解决多余的SQL语句
    • 单向维护:
    • 使一方放弃外键维护权:
      • 一的一方放弃。在set上配置inverse=”true”
  • 一对多的关联查询的修改的时候。(CRM练习–)
 <set name="linkMans" cascade="save-update,delete" inverse="true">
区分cascade和inverse
@Test
	/**
	 *  *区分cascade和inverse的区别
	 */
	public void demo08() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction tx = session.beginTransaction();
		
		Customer customer=new Customer();
		customer.setCust_name("张三");
		
		LinkMan linkMan=new LinkMan();
		linkMan.setLkm_name("陈七");
		
		customer.getLinkMans().add(linkMan);
		
		//条件在Customer.hbm.xml上的set中配置cascade="save-update" inverse="true"
		session.save(customer);//客户会插入到数据库,联系人也会插入到数据库,但是外键为null
		tx.commit();
	}

猜你喜欢

转载自blog.csdn.net/weixin_44757417/article/details/99873884