版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
一对多的级联操作
级联删除
- 级联删除:
- 删除一边的时候,同时将另一方的数据也一并删除。
删除客户级联删除联系人
<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();
}