一、一对多,多对一
1、表及实体的表达
2、映射文件中的配置:
3、操作关联属性
public class Demo {
@Test
//保存客户以及客户下的联系人
public void fun1() {
//1.获得sesison
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();
}
}
4、进阶操作
(1)级联操作
在映射文件中的配置:
操作代码演示:
public class Demo2 {
@Test
//保存客户以及客户下的联系人
//cascade:save-update
public void fun1() {
//1.获得sesison
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();
}
@Test
//测试删除客户时,级联删除客户下的联系人
public void fun2() {
//1.获得sesison
Session session = HibernateUtils.openSession();
//2.开启事务
Transaction tx = session.beginTransaction();
//3.操作
//1>获得要操作的客户对象
Customer c = session.get(Customer.class,1l);
//2>调用delete删除客户
session.delete(c);
//4.提交事务
tx.commit();
//5.关闭资源
session.close();
}
}
(2)关系维护
双向关联会产生冗余的sql语句,所以为了提高性能可以只让一方在进行关系的维护,所以可以使用inverse属性来解决这个问题二、多对多
1、表及实体的表达
2、多对多关系在映射文件当中的配置
开发中,遇到多对多关系,一定要选择一方放弃维护关系
由谁放弃看业务方向,例如录入员工时,需要为员工指定角色,那么业务方向是由员工维护角色,角色不需要维护与员工关系,所以角色放弃维护
操作代码:
/**
* @author
* @date 2017年10月17日 下午4:52:58
* @version V1.0
* @Description: 多对多操作
*/
public class Demo {
@Test
// 保存客户以及客户下的联系人
public void fun1() {
// 1 获得session
Session session = HibernateUtils.openSession();
// 2 开启事务
Transaction tx = session.beginTransaction();
// -------------------------------------------------
// 3操作
// 1> 创建两个 User
User u1 = new User();
u1.setUser_name("豆腐西施");
User u2 = new User();
u2.setUser_name("玛丽莲.梦露");
// 2> 创建两个 Role
Role r1 = new Role();
r1.setRole_name("演员");
Role r2 = new Role();
r2.setRole_name("名媛");
// 3> 用户表达关系
u1.getRoles().add(r1);
u1.getRoles().add(r2);
u2.getRoles().add(r1);
u2.getRoles().add(r2);
// 4> 角色表达关系
r1.getUsers().add(u1);
r1.getUsers().add(u2);
r2.getUsers().add(u1);
r2.getUsers().add(u2);
// 5> 调用Save方法一次保存
session.save(u1);
session.save(u2);
session.save(r1);
session.save(r2);
// -------------------------------------------------
// 4提交事务
tx.commit();
// 5关闭资源
session.close();
}
@Test
//为豆腐西施新增一个角色
public void fun2() {
// 1 获得session
Session session = HibernateUtils.openSession();
// 2 开启事务
Transaction tx = session.beginTransaction();
// -------------------------------------------------
// 3操作
//1>获得角色
User u = session.get(User.class,3l);
//2>创建一个豆腐店老板
Role r = new Role();
r.setRole_name("明星");
//3>将角色添加到用户中
u.getRoles().add(r);
//4>将角色转化为持久化
/*session.save(r);*/
// -------------------------------------------------
// 4提交事务
tx.commit();
// 5关闭资源
session.close();
}
@Test
//为豆腐西施解除一个角色
public void fun3() {
// 1 获得session
Session session = HibernateUtils.openSession();
// 2 开启事务
Transaction tx = session.beginTransaction();
// -------------------------------------------------
// 3操作
//1>获得角色
User u = session.get(User.class,3l);
Role r = session.get(Role.class, 3l);
//2>将角色从用户的角色中删除
u.getRoles().remove(r);
// -------------------------------------------------
// 4提交事务
tx.commit();
// 5关闭资源
session.close();
}
}