一、关系表达
表中的表达
实体中的表达
orm元数据中表达
一对多:
<!-- 集合,一对多关系,在配置文件中配置 --> <!-- name属性:集合属性名 column属性: 外键列名 class属性: 与我关联的对象完整类名 --> <set name="linkMens" > <key column="lkm_cust_id" ></key> <one-to-many class="LinkMan" /> </set>
多对一:
<!-- 多对一 --> <!-- name属性:引用属性名 column属性: 外键列名 class属性: 与我关联的对象完整类名 --> <many-to-one name="customer" column="lkm_cust_id" class="Customer" > </many-to-one>
二、操作关联属性
1、保存客户 以及客户 下的联系人
public void fun1(){ //1 获得session Session session = HibernateUtils.openSession(); //2 开启事务 Transaction tx = session.beginTransaction(); //------------------------------------------------- //3操作 Customer c = new Customer(); c.setCust_name("计算机"); LinkMan lm1 = new LinkMan(); lm1.setLkm_name("大神"); LinkMan lm2 = new LinkMan(); lm2.setLkm_name("小白"); //表达一对多,客户下有多个联系人 c.getLinkMens().add(lm1); c.getLinkMens().add(lm2); //表达多对一,联系人属于哪个客户 lm1.setCustomer(c); lm2.setCustomer(c); session.save(c); session.save(lm1); session.save(lm2); //------------------------------------------------- //4提交事务 tx.commit(); //5关闭资源 session.close(); }
2、为客户增加联系人
//1> 获得要操作的客户对象 Customer c = session.get(Customer.class,1l); //2> 创建联系人 LinkMan lm1 = new LinkMan(); lm1.setLkm_name("学生卡"); //3> 将联系人添加到客户,将客户设置到联系人中 c.getLinkMens().add(lm1); lm1.setCustomer(c); //4> 执行保存 session.save(lm1);
3、为客户删除联系人
//1> 获得要操作的客户对象 Customer c = session.get(Customer.class,1l); //2> 获得要移除的联系人 LinkMan lm = session.get(LinkMan.class, 3l); //3> 将联系人从客户集合中移除 c.getLinkMens().remove(lm); lm.setCustomer(null);
三、进阶操作
1、级联操作:简化操作,一定要用,save-update,不建议使用delete
<!-- 级联操作: cascade save-update: 级联保存更新 delete:级联删除 all:save-update+delete 级联操作: 简化操作.目的就是为了少些两行代码. -->
2、关系维护
在保存时,两方都会维护外键关系。关系维护两次,冗余了。 多余的维护关系语句,显然是客户这一端在维护关系
<!-- inverse属性: 配置关系是否维护. true: customer不维护关系 false(默认值): customer维护关系 inverse属性: 性能优化.提高关系维护的性能. 原则: 无论怎么放弃,总有一方必须要维护关系. 一对多关系中: 一的一方放弃.也只能一的一方放弃.多的一方不能放弃. -->