Hibernate框架学习(六)——一对多&多对一关系
一、关系表达
1、表中的表达
2、实体中的表达
3、orm元数据中的表达
一对多:(在Customer.hbm.xml中添加)
多对一:(在LinkMan.hbm.xml中添加)
最后别忘了在hibernate.cfg.xml中添加映射文件
二、操作关联属性
1、保存客户及客户下的联系人
1 public class Demo { 2 @Test 3 //保存客户以及客户下的联系人 4 public void fun1(){ 5 //1.获得session 6 Session session = HibernateUtils.openSession(); 7 //2.开启事务 8 Transaction tx= session.beginTransaction(); 9 //3.操作 10 //================================= 11 Customer c=new Customer(); 12 c.setCust_name("华为"); 13 14 LinkMan lm1=new LinkMan(); 15 lm1.setLkm_name("任正非"); 16 17 LinkMan lm2=new LinkMan(); 18 lm2.setLkm_name("孙亚芳"); 19 20 //表达一对多,客户下有多个联系人 21 c.getLinkMens().add(lm1); 22 c.getLinkMens().add(lm2); 23 24 //表达多对一,联系人属于哪个客户 25 lm1.setCustomer(c); 26 lm2.setCustomer(c); 27 28 session.save(c); 29 session.save(lm1); 30 session.save(lm2); 31 //================================= 32 //4.提交事务 33 tx.commit(); 34 //5.关闭资源 35 session.close(); 36 } 37 }
查看数据库(cst_customer和cst_linkman表结果如下)
2、为客户增加联系人(只需要改变步骤三操作里的内容)
1 //1>获得要操作的客户对象 2 Customer c = session.get(Customer.class,4l); 3 //2>创建联系人 4 LinkMan lm1=new LinkMan(); 5 lm1.setLkm_name("尹绪全"); 6 //3>将联系人添加到客户,再将客户设置到联系人中 7 c.getLinkMens().add(lm1); 8 lm1.setCustomer(c); 9 //4>执行保存 10 session.save(lm1);
3、为客户删除联系人(依然只需要改变步骤三操作里的内容)
1 //1>获得要操作的客户对象 2 Customer c = session.get(Customer.class, 4l); 3 //2>获得要移除的联系人 4 LinkMan lm1=session.get(LinkMan.class, 3l); 5 //3>将联系人从客户集合中移除 6 c.getLinkMens().remove(lm1); 7 lm1.setCustomer(null);
三、进阶操作
1、级联操作(简化操作,一定要用save-update,不建议使用delete)
比方说级联保存更新时,配置文件修改好后可以省略最后联系人的保存操作。
2、关系维护(性能优化,提高关系维护的性能)
问题:在保存时,两方都会维护外键关系,关系维护两次,冗余了。
多余的维护关系语句是客户这一端在维护。
解决:
原则:无论怎么放弃,总有一方必须要维护关系。
一对多的关系中:一的一方放弃,只能一的一方放弃,多的一方不能放弃(外键字段就在多的一方,不能不维护自己的列)。
3、执行删除客户操作时,不能直接删除