Hibernate框架的相关知识点(1)

hibernate框架基础了解
(一)Hibernate的三种状态如何转化?
当对象由瞬时状态(Transient)---save()时,就变成了持久化状态。
当在session中存储对象的时候,实际上是在session的Map中存了一份,也就是在它的缓存中存了一份,然后,又到数据库中存了一份,在缓存中的这一份叫做持久化对象(Persient)
Session---close(),它的缓存也都关闭了,整个session也就失效了,此时,这个对象变成了游离状态(Detached),但是在数据库中还是存在的
当游离状态(Detached)update()时,又变成了持久化状态。
当持久状态(Persistent)delete()时,又变成了瞬时状态,此时数据库中没有与之对应的记录
(二)Hibernate中update()和saveOrUpdate()的区别,session的load()和get()的区别
update是更新一个对象,针对的是已经存在的对象
saveOrUpdate是根据实体判断,如果没有的话就保存实体,如果有实体的话才修改
重点:最主要的区别就在于是否进行延迟加载load不会立即访问数据库,当试图加载的数据不存在时,load方法返回未初始化的代理对象;而get()会直接访问数据库,当试图
加载的数据不存在时,直接返回null。
(1).如果未发现符合条件的记录,get()方法返回null,而load方法会抛出一个ObjectNotFoundException
(2).load可返回实体的代理类实例,而get方法永远直接返回实体类
(3).load()可以充分利用内部缓存和二级缓存中的数据,而get仅仅在内部缓存中进行数据查找,如果没有发现对应数据,将越过二级缓存,直接调用sql完成数据读取

(三)比较Hibernate的三种检索策略优缺点
1.立即检索
优点:对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便的从一个对象导航到与它关联的对象
缺点:select语句太多,可能会加载应用程序不需要访问的对象白白浪费许多内存空间
2.延迟检索
优点:由应用程序决定加载哪些对象,可以避免可执行多余的select语句,以及避免加载应用程序不需要访问的对象。因此提高了检索性能,并且可以节省内存空间
缺点:应用程序如果希望访问游离状态的代理类实例,必须保证它在持久化状态时已经被初始化
3.迫切左外连接检索
优点:对应用程序完全透明,不管对象处于持久化状态还是游离状态,应用程序都可以方便的使一个对象导航到与它有关联的对象。使用了外连接,select语句数目减少
缺点:可能会加载应用程序不需要访问的对象,白白浪费许多内存空间;复杂的数据表连接也会影响检索性能

(四)Hibernate都支持哪些缓存策略
1.Read-only:这种策略适用于进行频繁读取却不会更新的数据,这是目前最简单和最有效的缓存策略
2Read/Write:这种策略适用于需要被更新的数据,比Read-only更耗费资源,在非JTA环境下,每个事务需要在session.close和session.disconnect()被调用
3.Nonstrict read/write:这种策略不保障两个同时进行的事务会修改同一块数据,这种策略适用于那些经常读取但极少更新 的数据
4.Transactional:这种策略时完全事务化的缓存策略,可以用在JTA环境下
(五)Hibernate工作原理以及为什么要用?
工作原理:
1.读取并解析配置文件
2.读取并解析映射信息,创建SessionFactory
3.打开session
4.创建事务Transation
5.持久化操作
6.提交事务
7.关闭session
8.关闭sessionFactory
为什么要用?
1.对JDBC访问数据库代码做了封装,大大简化了数据访问层繁琐的重复性代码
2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现
3.Hibernate使用了java的反射机制,而不是字节码增强程序来实现透明性
4.Hibernate性能非常好,是一个轻量级框架。映射的灵活性很出色。支持各种关系数据库,从一对一到对不多各种复杂关系
(六)如何优化Hibernate?
1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向一对多关联
3.不用一对一,使用多对一取代
4.配置对象缓存,不适用集合缓存
5.一对多集合使用Bag,多对多集合使用set
6.继承类使用显示多态
7.表字段要少,表关联不要怕多,因为有二级缓存来撑腰
(七)Hibernate中inverse的作用
在hibernate中,inverse属性默认是false,就是说关系的两端都来维护关系。例如Student和Teacher表是多对多关系,用一个TeacherStudent表来维护。
如果Student这边的reverse=“true”,那么关系就另一端Teacher来维护,就是说当插入学生时,不会操作TeacherStudent中间表。只有当Teacher插入或者删除时
才会除触发对中间表的操作。所以两边不能同时为reverse="true",因为会导致任何操作都不触发对中间表的影响;当两边reverse="false"时,也不行,因为会导致在中间表
中插入两次关系
(八)什么是SessionFactory,它是线程安全的吗?
SessionFactory是Hibernate单例数据存储是线程安全的,以至于可以多线程同时访问。一个SessionFactory在启动时只能创建一次。SessionFactory应该包装各种单例
以至于它能很简单的在一个应用代码中储存
(九)Spring_Hibernate中委托方案怎么配置?
解决方案一:按照Object[]数据取出数据,然后自己组装bean
解决方案二:对每个表的bean写构造函数,如比如表一要查询filed1,filed2两个字段,那么就有一个构造函数就是Bean(Type1 filed1,Type2 filed2),然后在hql里面就可以
直接生成这个bean了
(十)Hibernate二级缓存
(1)缓存就是把以前从数据库中查出来和使用过的对象保存在内存中,这个数据结构通常是或者类似HashMap,当以后要使用某个对象时,先查询缓存中是否有这个对象
,如果有则使用缓存中的对象,如果没有则去查询数据库,并将数据库中查询到的对象保存在缓存中,以便下次使用。
(2)Hibernate的session就是一种缓存,我们通常将之称为Hibernate的一级缓存,当想使用session从数据库中查询出一个对象时,Session也是先从自己的内部查看是否
存在这个对象,存在则直接返回,不存在就访问数据库,并将查到的结果保存在自己的内部。由于session代表一次会话过程,一个Session与一个数据库连接想关联,所以
Session最好不要长时间保持打开,通常仅用于一个事务当中,在事务结束时就应该关闭。并且Session是线程不安全的,被多个线程共享时容易出现问题。通常只有那种全
局意义上的缓存才是真正的缓存应用,才有比较大的缓存价值,因此Hibernate的Session这一级缓存的缓存作用并不明显,应用价值不大。Hibernate的二级缓存就是为
Hibernate配置一种全局缓存,让多个线程和多个事务共享这个缓存。我们希望时只有一个人使用过,其他人就都可以使用,Session缓存没有这种效果
(3)二级缓存时独立于Hibernate的软件部件,属于第三方的产品,多个厂商和组织都提供缓存产品,例如EHCache和OSCache等等。在Hibernate中使用二级缓存,搜先
就要在hibernate.cfg.xml配置文件中配置使用哪个厂家的缓存产品,接着需要配置该缓存产品自己的配置文件,最后要配置Hibernate中的哪些实体对象要纳入到二级缓存
的管理中。明白了二级缓存的原理和有了这个思路后,很容易配置起Hibernate的二级缓存。扩展知识:一个SessionFactory可以关联一个二级缓存,也即一个二级缓存只能
负责缓存一个数据库中的数据,当使用Hibernate的二级缓存后,注意不要有其他的应用或SessionFactory来更改当前数据库中的数据,这样的缓存数据就会与数据库中的
数据不一致

 

Hibernate框架的相关知识点(1)

上一篇:对NodeJS模块机制的理解


下一篇:Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭