hibernate笔记三
1. 一对多
1.1 一对多关系
- 什么样关系属于一对多?
- 一个部门对应多个员工,一个员工只能属于某一个部门。
- 一个客户对应多个联系人,一个联系人只能属于某一个客户。
- 一对多的建表原则:
1.1.1 映射文件配置
一的一方:
多的一方:
1.1.2 测试
1.1.3 一对多的级联操作
- 什么叫做级联
- 级联指的是,操作一个对象的时候,是否会同时操作其关联的对象。
- 级联是有方向性
- 操作一的一方的时候,是否操作到多的一方
- 操作多的一方的时候,是否操作到一的一方
操作:在一的一方set标签上加cascade=“save-update”
或者在多的一方many-to-one上加cascade=“save-update”
如果是想级联删除就是cascade=“delete”.
1.1.4 一对多设置了双向关联产生多余的SQL语句
- 解决多余的SQL语句
- 单向维护:
- 使一方放弃外键维护权:
- 一的一方放弃。在set上配置inverse=”true”
2. 多对多
2.1 多对多关系
- 什么样关系属于多对多?
- 一个学生可以选择多门课程,一门课程也可以被多个学生选择。
- 一个用户可以选择多个角色,一个角色也可以被多个用户选择。
- 多对多的建表原则:
2.1.1 映射关系
2.1.2 测试
2.1.3 多对多级联(同一对多)
3. Hibernate的抓取策略(优化)
3.1 延迟加载的概述
3.1.1 什么是延迟加载
延迟加载:lazy(懒加载)。执行到该行代码的时候,不会发送语句去进行查询,在真正使用这个对象的属性的时候才会发送SQL语句进行查询。
3.1.2 延迟加载的分类
- 类级别的延迟加载
- 指的是通过load方法查询某个对象的时候,是否采用延迟。session.load(Customer.class,1l);
- 类级别延迟加载通过上的lazy进行配置,如果让lazy失效
- 将lazy设置为false
- 将持久化类使用final修饰
- Hibernate. Initialize()
- 关联级别的延迟加载
- 指的是在查询到某个对象的时候,查询其关联的对象的时候,是否采用延迟加载。
Customer customer = session.get(Customer.class,1l);
customer.getLinkMans();----通过客户获得联系人的时候,联系人对象是否采用了延迟加载,称为是关联级别的延迟。 - 抓取策略往往会和关联级别的延迟加载一起使用,优化语句。
- 指的是在查询到某个对象的时候,查询其关联的对象的时候,是否采用延迟加载。
3.2 抓取策略
3.2.1抓取策略的概述
- 通过一个对象抓取到关联对象需要发送SQL语句,SQL语句如何发送,发送成什么样格式通过策略进行配置。
- 通过或者上通过fetch属性进行设置
- fetch和这些标签上的lazy如何设置优化发送的SQL语句
3.2.2 set标签上的fetch和lazy
- fetch:抓取策略,控制SQL语句格式
- select :默认值,发送普通的select语句,查询关联对象
- join :发送一条迫切左外连接查询关联对象
- subselect :发送一条子查询查询其关联对象
- lazy:延迟加载,控制查询关联对象的时候是否采用延迟
- true :默认值,查询关联对象的时候,采用延迟加载
- false :查询关联对象的时候,不采用延迟加载
- extra :及其懒惰。
在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join。
3.2.3 many-to-one标签上的fetch和lazy
- fetch :抓取策略,控制SQL语句格式。
- select :默认值,发送普通的select语句,查询关联对象。
- join :发送一条迫切左外连接。
- lazy :延迟加载,控制查询关联对象的时候是否采用延迟。
- proxy :默认值,proxy具体的取值,取决于另一端的上的lazy的值。
- false :查询关联对象,不采用延迟。
- no-proxy :(不会使用)
在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join。
3.2.4 批量抓取
一批关联对象一起抓取,batch-size