hibernate 的多表设计 关联关系映射 级联操作
1.1表之间关系存在3种:一对多、多对多、一对一
1.1 一对多操作
一个客户有多个订单(即订单的外键和客户主键相关联)
直接代码:
@Test public void TestDemo1(){ Session session= HibernateUtils.openSession(); Transaction transaction= session.beginTransaction(); Customer customer=new Customer(); customer.setCname("ssml003"); Order order = new Order(); order.setPrice("998003"); customer.getOrderSet().add(order); order.setCustomer(customer); session.save(customer); session.save(order); transaction.commit(); session.close(); }
执行结果入下:
1.1 级联操作(读、理解)
客户的xml中 cascade="save-update"
1.1.1 save-update 级联保存或更新
// 32 创建客户和订单,客户关联订单,保存客户? --抛异常
// ** 解决方案2:级联操作--级联保存或更新
// ** Customer.hbm.xml <set cascade="save-update">
// ** 在保存客户的同时,一并保存订单
代码://级联 @Test public void TestDemo2(){ Session session= HibernateUtils.openSession(); Transaction transaction= session.beginTransaction(); Customer customer=new Customer(); customer.setCname("ssml004"); Order order = new Order(); order.setPrice("998004"); customer.getOrderSet().add(order); order.setCustomer(customer); session.save(customer); //未保存订单 transaction.commit(); session.close(); }
结果:保存了俩个
1.1.1 delete 级联删除
代码:
//级联删除 @Test public void TestDemo3(){ Session session= HibernateUtils.openSession(); Transaction transaction= session.beginTransaction(); Customer customer= (Customer)session.get(Customer.class,7); session.delete(customer); transaction.commit(); session.close(); }结果:
1.1.1 孤儿删除
总结:
主表不能删除,从表已经引用(关联)的数据
从表不能添加,主表不存在的数据。
1.1.1 总结
save-update:A保存,同时保存B
delete:删除A,同时删除B,AB都不存在
delete-orphan:孤儿删除,解除关系,同时将B删除,A存在的。
如果需要配置多项,使用逗号分隔。<set cascade="save-update,delete">
all : save-update 和 delete 整合
all-delete-orphan : 三个整合