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
   这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。

你可能感兴趣的:(spring,sql,Hibernate,ibatis,配置管理)