hiberate的查询方法:
1.使用主键id加载对象(load(),get());
2.通过对象导航,比如通过stu.getTeam()得到team的实例;
3 使用hql;
4使用qbc(query by criteria)
5直接使用sql语句取得记录集;
一般都使用后面三种方式.
注意.hql是面向对象的查询.语法和sql是基本一样的.不区分大小写的,但是注意的是对与对象.必须遵循对象的大小写.因为hql是对像查询..同时我们必须清楚.hql只能取得对象,而不支持uid(update,insert.delete)
hql功能很强大,适合各种情况,但是动态条件查询构造起来很不方便.
criteria 最适合动态查询,但不太适合统计查询,qbe还不够强大.只适合简单的查询.
nativesql可以实现特定的数据库的sql.但是可移植性并不好.
针对web应用来说,大部分常规查询都是动态条件查询,所以首先criteria,并且h 3提供的detachedcriteria,可以在web层构造好detachedcriteria再进入session执行查询.但是涉及到统计查询和非常复杂的关联查询.criteria就无能为力了.这种情况下选择使用hql.最后如果涉及到使用某些数据库的特性的时候,就只有选择 nativesql了
get和load的区别:
1>不存在对应记录时表现不一样
2>load返回的是代理对象(javassist.jar生成二进制码),等到真正用到对象的内容才会发出SQL语句
3>get直接从数据库加载,不会延迟
无论是get还是load,都会首先查找缓存(一级缓存),如果没有,才会去数据库查找,调用clear()方法,可以强制清除session缓存
调用flush()方法可以强制进行从内存到数据库的同步。
SessionFactory
1>用来管理Session
2>通常情况下每个应用只需要一个SessionFactory
3>除非要访问多个数据库的情况
4>关注两个方法即可
i>openSession每次都是新的,需要close();
ii>getCurrentSession从上下文找,如果有,用旧的,如果没有,创建新的
a>用途,界定事务边界
b>事务提交自动close;
c>current_session_context_class(jta或者thread)
thread使用connection
<一>list和iterate的区别:
a>list取出所有
b>iterate取出id,等要用的时候再根据id取出对象
c>session中的list第二次发出,仍然会倒数据库查询
d>iterate第二次,首先找session级缓存
getCurrentSession()一定要在事务中使用!!!
<二>缓存问题
i:一级缓存:
session级别的缓存
ii:二级缓存:
SessionFactory级别缓存,可以跨Session级别访问
什么对象应该放在二级缓存?
1>经常被访问
2>改动不大
3>数量有限
怎么使用二级缓存?
第一步:打开二级缓存。
第二步:在hibernate文件里面配置如下信息:<这是使用ehcache实现>
第四步:在映射类文件中添加属性:
默认情况下,load会使用二级缓存,iterate会使用二级缓存。
list会默认往二级缓存添加数据,但是查询的时候不使用。
iii:查询缓存:
是指同样的,重复查询使用的缓存。
查询缓存依赖于二级缓存,所以,需要打开二级缓存。
缓存算法:LRU,LFU,FIFO(面试意义更大,实际当中很少用到)
1.Least Recently Used
2.Least Frequently Used(命中率低)
3.First Infirst Out
memoryStoreEvictionPolicy=”LRU”(ehcache)。
<三>事务的并发处理(面试的意义更大)
并发出现的问题:
1>第一类丢失更新
2>脏读
3>不可重复读
4>幻读
设置Hibernate的设置级别:
1:read-uncommitted
2:read-uncommitted
4:repeatable-read
8:serializable
设置锁的隔离级别:
一对多中,一的一方有多的一方集合,多的一方有以的一方的实体类。
一的一方配置示例: