转载请注明出处:https://oldnoop.tech/c/129.html
介绍
Hibernate是一个持久层框架, 一般用在dao层
Hibernate的session是线程不安全的,SessionFactory是线程安全的
与spring集成使用,一般Dao层继承spring提供的 HibernateDaoSupport,或者HibernateTemplate,从而获得spring提供的模板方法
查询
Hibernate主要有查询有3种方式
session.createQuery(String hsql); 创建hql查询
session.createCriteria(Class<?> clazz); 创建criteria条件查询
session.createSQLQuery(String sql); 创建原生sql查询
分页
Hibernate查询分页使用查询对象的使用setFirstResult,setMaxResults这两个方法
hibernate连接查询
使用hibernate的连接查询,必须配置映射关系
使用fetch,强制抓取设置为lazy=true的关联数据,避免N+1条查询问题
Hibernate缓存
一级缓存即session缓存
一级缓存的生命周期和session的生命周期保持一致,hibernate默认就启用了一级缓存
get,load,iterate都会使用一级缓存
二级缓存sessionFactory
一个实例对应一个数据存储源.它是线程安全的,是重量级的.它需要一个很大的缓存,用来存放预定义的SQL语句以及映射元数等
三级缓存即查询缓存
查询缓存是针对普通属性结果集的缓存,对实体对象的结果集只缓存id
get 和 load的区别
get不支持懒加载,load支持懒加载,
查询不到数据,get返回null, load抛出异常
主键生成策略
使用generator标签配置,class属性配置具体的策略
identity, 使用数据库的生成策略,一般数据库要求支持自增长,mysql可以使用
sequenece, 使用序列, oracle可以使用
uuid 使用uuid的字符串
native, 交给数据库自己处理,
assign, 编码时指定id
Hibernate懒加载问题
在视图层显示懒加载数据的问题
Hibernate配置懒加载之后, 在视图层 使用jstl或者freemarker的标签 ${ 对象.属性}, 这个时候需要查询数据库,但是这个时候, session已经关闭了,
可以在web.xml使用OpenSessionInView过滤器, 在视图层打开 hibernate的session