一、cascade(级联)
cascade参数:
save-update:A保存,同时保存B
delete:删除A,同时删除B,AB都不存在
delete-orphan:孤儿删除,解除关系,同时将B删除,A存在的
all : save-update 和 delete 整合
all-delete-orphan : 三个整合
如果需要配置多项,使用逗号分隔。<set cascade="save-update,delete">
其他都很好理解,这里着重解释一下孤儿删除
孤儿删除只存在于一对多的环境,当解除关系的时候,将此条记录删除
@Test public void demo06(){ // 6 查询客户,并查询订单,解除客户和订单订单的关系 // * 默认:客户和订单解除关系后,外键被设置成null,此时订单就是孤儿。客户和订单都存在。 // * 孤儿删除(孤子删除),当订单称为孤儿,一并删除。客户仍存在。 Session session = factory.openSession(); session.beginTransaction();
//1 查询客户 Customer customer = (Customer) session.get(Customer.class, 9);
//2查询订单 Order order = (Order) session.get(Order.class, 8);
//3 解除关系 customer.getOrderSet().remove(order);
session.getTransaction().commit(); session.close(); } |
Ps:主表不能删除,从表已经引用(关联)的数据
从表不能添加,主表不存在的数据。
二、inverse
inverse为布尔值,并且inverse的默认值是true,作用是维护级联关系,也就是说由true的这方来设置外键。所以上面cascade是由inverse决定的,只有你inverse设置为true,你所设置的级联关系才能生效。如果不设置inverse,默认由一对多中的多去进行维护。
总结:也就是说inverse和cascade通常是一起使用,inverse是决定由哪一方进行维护,cascade是决定维护的方法(也就是如何去维护)