Hibernate原理性的知识详解
# jar包的主要作用:
* antlr.jar:主要是语法的分解器。
* cglib.jar:主要是处理动态代理的jar包。
* asm.jar:可以操作class文件,动态的给class文件加一个属性或方法。
* 与asm类似的例子有window汇编语言直接操作CPU的。
* commons-Collections.jar:主要是处理集合类。
* commons-logging.jar:日志文件
* ehcache.jar:处理二级缓存的
* Hbernate.jar:是Hibernate本身的jar包
* jta.jar:是处理事务的API的。
# 持久化对象:必须id属性是唯一的标识符的值,要求是无参的构造器。
# 不管我们是看源码还是看其他的技术,只要看到有helper class的就可以确认它是辅助类
# ThreadLocal:是用于启动事务的,不管是Ibatis还是其他的,都是通过Spring模板来实现的
# 反模式:错误的模式,性能低的模式(相当于一个反面教程)
# 持久化类的三种状态:
* 瞬时状态:就是当我们new一个对象的时候,并没有保存的
* 持久化状态:就是刚刚保存的或刚刚被加载的数据
* 脱管状态:就是session已经被关闭了
* session刷新:当刷新和提交方法同时被调用时,sql语句会按照顺序发出执行,
1.所有实体进行插入2.所以实体进行更新
3.所以进行集合删除,要除非明确调用flush方法。
* 级联(cascade)操作:当父类删除时,子类要不要执行这些操作,
以及当父类调用这一系列的操作方法时,
可以传到子类中来,一般级联通常用在一对一,一对多的关系。元数据,
就是配置数据对当前类的一些数据字典的描述。
* 在hibernate中不存在锁定内存的对象
* 拦截器:与struts2大同小异,在hibernate中的拦截器,主要是对增删查改操作的拦截,
拦截器有两种,就是session和sessionFactory范围内的,而拦截器拦截的方法返回的是布尔型的,
返回真就给数据保存,
返回假就不会保存,当hibernate触发一个事件交给相关的处理类,
加载监听器时需要实现LoadEventListener接口。
*提升性能主要是与缓存有关,抓取策略,在这个知识点中主要是牵涉到一个N+1的问题。
什么是N+1查询?
1指的是一条查询语句,通过这条查询语句就会的得到一张表.N是指得到两个表间的查询,而表中的每条记录都对应着一个外键.
所以在查询的时候就会出现多条select语句,这样的话,查询的速度会明显的降低,hibernate性能下降.
这就是典型的N+1的问题.
那么既然会出现N+1的问题那么怎么来解决这个问题呢?
解决的方案: 第一: 通过二级缓存和左外联接还有lazy=true来解决,
其实二级缓存在解决这个问题的时候,是带有一点bug的,为什么呢?因为会出现缓存的原因是.我们在查询数据的时候
才会产生缓存,然后在把这个缓存保存到SessionFactory中.意思就是说我们要读取一次数据库才能产生缓存.所以用
二级缓存来解决这个问题的时候第一次还是会比较慢.
而lazy=true,hibernate开始已经默认是lazy=true了,而lazy=true时不会立刻查询关联对象,只有当需要关联对象(访问其属性,非id字段)时才会发生查询动作
一级缓存和二级缓存:
一级缓存它是保存在Session中的
这一级别的缓存由hibernate管理的,一般情况下无需进行干预
Session关闭了,存在Session中的以及缓存也会被清理掉
Get()和load(),iterate方法都会使用一级缓存,
二级缓存它是保存在SessionFactory中
如果需要实行他的话就需要使用第三方的jar包:ehcache.jar
这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。