开发者学堂课程【Java 面试疑难点串讲 3:开发工具及框架:Hibernate Session 生命周期】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/26/detail/552
Hibernate Session 生命周期
Hibernate 里面没有所谓的 Session 生命周期。因为 Session 严格来讲就是指的每-个用户,而如果是实体层里面把 Session 有两点作用(基于 Hbernate)。
一个是维护对象的状态,也就是说持久态问题:如果现在使用了 Session 对象的get().load() 方法进行了某一个数据查询的时候,默认情况下只要 Sssion 不关闭,那么就表示该 Session 中的对象一直与数据库中的实例关联,那么这个时候如果你调用了 POJO 类的 setter 方法修改的数据。
就会引起数据表中对应数据行的数据改变,这个就是持久态的设计,而这种设计也是整个 Hibernate 最烂的一点。但是如果倒退到十年前,这就是最好的设计,因为此设计与 EB (ntit Bean) 效果是一样的。
还有一个是进行一级缓存使用的:指的是如果现在要进行 get().load() 数据查询的时候,只要该数据查询了一次,并且在 Session 不关闭的情况下继续重复使用,那么对于 Hibernate 而是不会继续重复发出查询指令的。
而是会将对象默认保存在内存里面,如果发现有同样的主键查询。那么就直接通过内存加载。
Hibernate 的 Session 是在使用的时候通过 SessionFactory 打开 (Spring 整合的时候也是使用 SessionFactory 打开),这个打开和关闭自动的在你使用之前和之后自动处理操作。
这里面有一个问题:在 Spring 与 Hibernate 整合的时候由于存在有一个数据的延迟加载机制,所以在 Spring 里面会提供有一种策略:“OpenlnView" 指的是Hibernate 的 Session 延迟到页面显示完毕后在进行关闭。
这样就解决了数据的级联显示操作。但是这种处理会对事务控制造成困难,所以此类开发好像是没有在实际的工作中出现过的。