hibernate
悲观锁 load 方法里 有对应的 LockMode 参数。实现悲观锁。( lazy 策略 失效。因为要锁定)
乐观锁 在配置文件 hbm 里面 class 标签中 增加 optimistic-lock=“version” 项,并且在想要做乐观锁的类里 增加 相应的 version 字段,然后在 id 标签下,增加 <version name = "version"> 标签,指明用做 version 的字段是 version 。并且在对应的类里增加 version 字段,如: private int version 。
乐观锁的实现中,线程 A 和 B 修改同样数据, B 先提交, version 增加。 A 再进行提交操作的话,会报出脏数据错误。
====================================================
HQL
createquery ()和 createSQLQuery ()
外置命名查询:在要查询的类的配置文件 hbm 中加入
< query name = "searchStudent" ><![CDATA[ select s from Student s where s.id < ? and s.classes.name like ]]></ query >
(其中用到了对象导航查询 s.classes.name )
用 session.getNamedQuery("searchStudent") 来查询。
查询过滤器:在要查询的类的配置文件 hbm 中加入
< filter-def name = "stu_search_filter " >< filter-param name = "stu_name " type = "string" /></ filter-def >
在 class 标签中 加入:
<filter name="stu_search_filter " condition="name like :stu_name "></filter>
在程序中调用 session.enableFilter("stu_search_filter ").setParameter("stu_name ", "%0%"); 。对应着过滤器名称 和传入的参数。
二级缓存
一级缓存 的生命周期是 session 级
二级缓存 的生命周期是 sessionFactory 级
所用 ehcache 来提供缓存
首先在 src 下加入 ehcache.xml 配置文件。 Ehcache 配置文件参数简介
MaxelementsInmemory=10000 缓存里最多存 10000 个对象
Eternal=false 不是永久有效
TimetoLiveseconds=”120” 对象在缓存中存活多长时间 s 为单位
Timetoidleseconds=”120” 空闲 多长时间不访问失效
OverflowTodisk=true 超出 10000 对象,是否保存到磁盘上。路径
<diskstore path=”java.io.tmpdir”>
然后在 hibernate.xml 中开启二级缓存(默认是开启的),声明缓存提供商,也就是处理缓存的类。启用二级缓存
< property name = "hibernate.cache.use_second_level_cache" > true </ property >
< property name = "hibernate.cache.provider_class" >
org.hibernate.cache.EhCacheProvider </ property >
<property name="hibernate.cache.use_query_cache">true</property>
并且在 mapping 标签下 加入所要实施缓存的类
<class-cache usage="read-only" class="com.john.hibernate.Student"/>
以上就可以完成缓存的设置。
通过设置缓存交互模式,可以设置管理缓存。
session.setCacheMode(CacheMode.GET/PUT/NOMAL);( 只读不写,只往缓存里放数据而不读数据。默认是可读可写 )
查询缓存
query.setCacheable(true);
Query query = session.createQuery( "fromStudent" );
query.setCacheable( true );
List stu = query.list();
关联对象的抓取策略 在 <many-to-one….fetch=”select”>
Select 另外发送一条 sql 抓取当前对象的关联对象或集合
Join 会用过 select 语句使用外连接 来加载其关联实体或集合 此时 lazy 失效。
Subselect 常用于集合 <set fetch=”subselect”>
影响 HQL 查询。会通过一条子查询语句,把所有对象查出来。
Batch-size 属性 可以批量加载对象:
<class name="com.john.hibernate.Student" table="t_student" batch-size="5">
在 hibernate.xml 中加入
< property name = "hibernate.jdbc.batch_size" > 30 </ property > (批量更新缓存)
< property name = "hibernate.jdbc.fetch_size" > 50 </ property > (批量查询缓存)