Hibernate_03---表与表关系建立、一对多配置及操作、多对多配置及操作
一、表与表关系建立思路
一对多关系
关系举例:
(1)分类和商品关系。
一个分类里面有多个商品,一个商品只能属于一个分类
(2)公司和员工关系
一个公司有多个员工,每个员工属于一个公司
一对多建表:通过外键建立关系
图示:
多对多关系
关系举例:
(1) 人与角色关系
一个人有多个角色(学生,儿子,青年),一个角色可以有多个人(张三、李四、王五)
多对多建表:创建第三张表维护关系
图示
二、一对多环境配置
客户和联系人:客户是一,联系人是多。
第一步 创建两个实体类,客户和联系人。
//客户
public class Customer {
private Integer cid; //客户id
private String custName; //客户名称
private String custLevel; //客户级别
private String custSource; //客户来源
private String custPhone; //联系电话
private String custMobile; //手机
}
//联系人
public class LinkMan {
private Integer lkm_id; // 联系人编号(主键)
private String lkm_name;// 联系人姓名
private String lkm_gender;// 联系人性别
private String lkm_phone;// 联系人办公电话
}
第二步 让两个实体类之间互相表示
//Hibernate要求用Set集合存放多的一方,泛型为多的类。
//多对一中的一 (客户)
private Set<LinkMan> setLinkMan = new HashSet<LinkMan>();
public Set<LinkMan> getSetLinkMan() {
return setLinkMan;
}
public void setSetLinkMan(Set<LinkMan> setLinkMan) {
this.setLinkMan = setLinkMan;
}
//在多中,创建一的类。用来表示所属关系 (一个联系人只能有一个客户)
//多对一中的多(联系人)
private Customer customer;
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
第三步 配置映射关系
1)完成基本配置(每个实体类分别对应一个映射文件)
2)配置一对多映射关系(使用set标签)
在客户映射文件中,表示所有联系人
在联系人映射文件中,表示所属客户
第四步 创建核心配置文件,把映射文件引入到核心配置文件中
建表,测试配置
三、一对多级联操作
级联保存
(1)复杂写法:
/**
* HibernateOneToMany
* 添加客户添加联系人测试
*
* @author 一万年行不行
*/
public class HibernateOneToMany {
SessionFactory sessionFactory = null;
Session session = null;
Transaction transaction = null;
@Test
public void oneToMany(){
try{
//1.得到sessionFactory创建表.
sessionFactory = HibernateUtils.getSessionFactory();
//2.得到session
session = sessionFactory.openSession();
//3.调用session开启事务
transaction = session.beginTransaction();
/*
* 4.业务逻辑---添加客户
*
* 1.创建客户、
* 2.创建联系人、
* 3.将联系人设置到客户、
* 4.为联系人设置客户
* 5.保存到数据库
*/
//创建客户
Customer customer = new Customer();
customer.setCustName("百度");
customer.setCustLevel("vip");
customer.setCustSource("网络");
customer.setCustPhone("123456");
customer.setCustMobile("5555");
//创建联系人
LinkMan linkman = new LinkMan();
linkman.setLkm_name("lucy");
linkman.setLkm_gender("男");
linkman.setLkm_phone("911");
//将联系人设置到客户、
customer.getSetLinkMan().add(linkman);
//为联系人设置客户
linkman.setCustomer(customer);
//保存到数据库
session.save(customer);
session.save(linkman);
//5.提交事务
transaction.commit();
}catch(Exception e){
//5.事务回滚
transaction.rollback();
}finally{
//6.关闭资源
session.close();
//sessionFactory.close();
}
}
}
测试
(2)简化写法
简化内容:只需要在客户添加联系人即可,不再需要双向保存
级联删除
第一步 在客户映射文件set标签,进行配置
使用属性cascade属性值 delete
第二步 在代码中直接删除客户
根据id查询对象,调用session里面delete方法删除
修改操作(inverse属性)
(1)因为hibernate双向维护外键。
导致系统需要修改两次外键(客户和联系人都需要维护外键),造成效率问题
(2)解决方式:让其中的一方不维护外键(多对一中的一)
四、多对多映射配置
以用户和角色为例演示
第一步 创建实体类,用户和角色
第二步 让两个实体类之间互相表示
(1)一个用户里面表示所有角色,使用set集合
(2)一个角色有多个用户,使用set集合
第三步 配置映射关系
(1)基本配置
(2)配置多对多关系
第四步 在核心配置文件中引入映射文件
建表 测试配置:
五、多对多操作
级联保存
第一步 在用户配置文件中set标签进行配置,cascade值save-update
第二步 代码实现
(1)创建用户和角色对象,把角色放到用户里面,保存用户
//演示多对多修级联保存
@Test
public void testSave() {
SessionFactory sessionFactory = null;
Session session = null;
Transaction tx = null;
try {
//得到sessionFactory
sessionFactory = HibernateUtils.getSessionFactory();
//得到session
session = sessionFactory.openSession();
//开启事务
tx = session.beginTransaction();
//添加两个用户,为每个用户添加两个角色
//1 创建对象
User user1 = new User();
user1.setUser_name("lucy");
user1.setUser_password("123");
User user2 = new User();
user2.setUser_name("mary");
user2.setUser_password("456");
Role r1 = new Role();
r1.setRole_name("总经理");
r1.setRole_memo("总经理");
Role r2 = new Role();
r2.setRole_name("秘书");
r2.setRole_memo("秘书");
Role r3 = new Role();
r3.setRole_name("保安");
r3.setRole_memo("保安");
//2 建立关系,把角色放到用户里面
// user1 -- r1/r2
user1.getSetRole().add(r1);
user1.getSetRole().add(r2);
// user2 -- r2/r3
user2.getSetRole().add(r2);
user2.getSetRole().add(r3);
//3 保存用户
session.save(user1);
session.save(user2);
//提交事务
tx.commit();
}catch(Exception e) {
tx.rollback();
}finally {
session.close();
//sessionFactory不需要关闭
sessionFactory.close();
}
}
级联删除
第一步 在set标签进行配置,cascade值delete
第二步 删除用户
#六、维护第三张表关系
用户和角色多对多关系,维护关系通过第三张表维护
1)产生关系
第一步 根据id查询用户和角色
第二步 把角色放到用户里面
2)删除关系
第一步 根据id查询 用户和角色
第二步 去掉用户中的角色