1、基本操作,保存客户、联系人,并设置它们的关联
public void test01(){
Session session = HibernateUtils.OpenSession();
Transaction tx = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_name("传播智客");
LinkMan lm1 = new LinkMan();
lm1.setLkm_name("黎活明");
LinkMan lm2 = new LinkMan();
lm2.setLkm_name("刘悦东");
//表达一对多,一个客户下有多个联系人
customer.getLinkMens().add(lm1);
customer.getLinkMens().add(lm2);
//表达多对一,联系人属于哪个客户
lm1.setCustomer(customer);
lm2.setCustomer(customer);
//瞬时态-->持久态
session.save(customer);
session.save(lm1);
session.save(lm2);
tx.commit();
session.close();
}
2、为客户添加联系人
@Test
public void test02(){
Session session = HibernateUtils.OpenSession();
Transaction tx = session.beginTransaction();
//获得要操作的客户
Customer customer = session.get(Customer.class, 1l);
//创建联系人对象
LinkMan lm = new LinkMan();
lm.setLkm_name("郝强勇");
//将联系人添加到客户对象中
customer.getLinkMens().add(lm);
//设置联系人的客户
lm.setCustomer(customer);
//执行保存
session.save(lm);
tx.commit();
session.close();
}
3、为客户删除联系人
public void test03(){
Session session = HibernateUtils.OpenSession();
Transaction tx = session.beginTransaction();
//获得要操作的客户
Customer customer = session.get(Customer.class, 1l);
//获得要删除的联系人
LinkMan lm = session.get(LinkMan.class, 3l);
//将联系人从客户对象中移除
customer.getLinkMens().remove(lm);
//设置联系人的客户为空
lm.setCustomer(null);
tx.commit();
session.close();
}
一对多表操作进阶---级联操作:
一的一方的映射文件配置:
<!--
级联操作:cascade
save-update:级联保存
delete:级联删除
all:save-update+delete
-->
<set name="linkMens" cascade="save-update">
<key column="lkm_cust_id"></key>
<one-to-many class="LinkMan"/>
</set>
public void test01(){
Session session = HibernateUtils.OpenSession();
Transaction tx = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_name("传播智客");
LinkMan lm1 = new LinkMan();
lm1.setLkm_name("黎活明");
LinkMan lm2 = new LinkMan();
lm2.setLkm_name("刘悦东");
//表达一对多,一个客户下有多个联系人
customer.getLinkMens().add(lm1);
customer.getLinkMens().add(lm2);
//表达多对一,联系人属于哪个客户
lm1.setCustomer(customer);
lm2.setCustomer(customer);
//瞬时态-->持久态,级联保存
session.save(customer);
//session.save(lm1);
//session.save(lm2);
tx.commit();
session.close();
}
2、级联删除
public void test04(){
Session session = HibernateUtils.OpenSession();
Transaction tx = session.beginTransaction();
//级联删除
Customer customer = session.get(Customer.class, 1l);
session.delete(customer);
tx.commit();
session.close();
}
目的:简化操作,一般使用save-update,不建议使用delete。
3、关系维护
在保存时,两方都会维护外键关系,关系维护了两次,冗余了。多余的关系维护语句,显然是客户端在维护外键关系。