当前位置:首页 > Hibernate框架Day6
延迟加载:hibernate在调用查询方法后,不会立即的执行sql语句 把对应的数据库中的数据查询出来,只有当用户明确的需要使用非主键数据时,才会发送sql语句进行查询
延迟加载的分类
1 一般属性的延迟加载
一般属性的延迟记载 发生在 session.load(class,pk)进行的查询操作中 好处:
某些只需要使用pk进行操作的代码中,一般属性的延迟加载可以减少内存占用
典型应用场景:获得主键设置关系的操作
UserDAO{
public void deleteUser(int id); }
HibernateUserDAO{
public void deleteUser(int id){
//User user = session.load(User.class,id); User u = new User(); u.setId(id); session.delete(u); } }
注册员工的应用场景
注意:session.get() session.load();
区别:1 get立即加载 load一般属性延迟加载
2 如果传入的主键参数不存在 get()可以执行查询 但是返回 null load()抛出异常
2 关系属性的延迟加载
普遍存在存在延迟加载
一个对象的关系属性 会进行延迟加载 只有当需要使用关系属性中非id的属性值时,hibernate才会发送sql语句查询关系属性的内容 好处:
当只需要使用本对象相关数据时,关系属性进行延迟,减少不别要的内存占用
注意:session.load(Dept.class,1) 一般属性 关系属性的延迟加载
session.get(Dept.class,2) 只有关系属性延迟加载
3 延迟加载原理:
Teacher t = (Teacher)session.load(Teacher.class,1); t.getName();
hibernate通过动态字节码技术(早期 cglib技术 现阶段 javassist技术) 动态生成的一个 Teacher类的子类 hibernate:
HibernateTeacher extends Teacher{
@Override
public String getName(){
连接数据库 发送sql命令查询的代码 return name; }
@Override
public String getSalary(){ } }
4 延迟加载异常
当延迟加载一个数据时,在事务提交后,在进行加载,就会产生延迟加载异常,主要原因在于事务提交session关闭 解决延迟加载异常:
1 扩大事务边界:把延迟加载的代码放置到事务的内部 Spring OpenSessionInView
2 fetch迫切连接:关系属性的延迟加载
inner join
left outer join 使用 重复数据 LinkedHashSet过滤
3 改变延迟加载的默认策略
不让延迟
1 不让一般属性延迟加载
3 Hibernate继承关系映射 ? 继承关系映射概念:t 实体间的关系2类 1 关联关系映射 1:1 1:* *:* has a 2 继承关系 (了解) is a ? 什么情况下会出现实体间的继承关系 Teacher extends Employee{
共分享92篇相关文档