1、hibernate的缓存:Hibernate提供了两级Cache,第一级的缓存是session级别的缓存,它是属于事务范围的缓存。这一级别的缓存是由Hibernate管理事务,一般情况下无需进行干预;第二级缓存是sessionFactory级别的缓存,它是属于进程范围或群集范围的缓存,这一级缓存可以进行配置和修改,并且可以动态加载和卸载。Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。
什么样的数据适合存放在第二级缓存中?
1)很少被修改的数据
2)不是很重要的数据,允许出现偶尔并发数据
3)不会被并发访问的数据
4)参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例应用,实例极少或者从来不会被修改。
关于Hibernate的二级缓存:缓存是否实用,要看需求:如果系统浏览人数比较多,但是增删的比较少,缓存的功劳非常大,如果系统的即时性比较强,那么缓存的命中率就比较低,同时更新数据时,Hibernate需要额外提供资源维护缓存与数据的一致。
2、系统报错:Caused by: org.hibernate.AnnotationException: No identifier specified for entity: com.cn.Buy.bean.Company
解决:主要原因是缺少了主键
3、异常总结:org.hibernate.hql.ast.QuerySyntaxException: is not mapped
4、需求:在保存新的合同前,先找到旧的合同的责任人。
问题: 先根据load()方法,传入旧的合同,得到旧的责任人后赋值给一个变量A,紧接着又执行保存(save)方法,可是,在保存后断点看变量A,竟然发现它的值已经被改变了
分析原因:因为load()和save()都是hibernate的,有可能是java本身赋值是值的引用,在调用save()方法之后,hibernate将再次赋值,导致变量A的值也发生了改变。
处理方法:将load()改成jdbctemplate()方法得到值,赋值给变量A,再执行save()方法,这样就可以解决问题!
5、Hibernate的五大对象(五个核心的接口)
Configuration
接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。
sessionFactory
接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建 Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个 SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
session
接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的 SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的 HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSesion对象称为用户session。
transction
接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。
Query和Criteria
接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式
6、Hibernate三大状态(http://blog.csdn.net/redarmy_chen/article/details/7069482)
瞬时态:由new操作符创建,且尚未与Hibernate Session关联的对象被认定为瞬时(Transient)的。瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)。如果瞬时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁。使用Hibernate Session可以将其变为持久(Persistent)状态。(Hibernate会自动执行必要的SQL语句)。
瞬时状态的特点有:
1、 与数据库中的记录没有任何关联,也就是没有与其相关联的数据库记录。
2、 与Session没有任何关系,也就是没有通过Session对象的实例对其进行任何持久化的操作。
持久态:
脱管态:
7、关于建立抽象的基类(如ID类),其他子类通过继承该类成真正的实体。按照以前的思维方式实现,却发现依然存现问题:
出现主键没有找到:解决方式是将ID的修饰符的习惯性的private改成procted或其他类型。还有就是在该基类上标注@MappedSuperclass,这样子才能算成功引用基本的ID作为实体类的ID。Hibernate也不会在运行的时候报错!
