Hibernate总结
部署环境
u 将hibernate.jar及lib目录中的.jar文件拷到工程的lib目录下。同时将配置文件hibernate.cfg.xml和属性文件log4j.properties放到src目录下。
u mysql驱动jar包布署在类路径下
如连接mysql的配置文件如下:
<session-factory>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/user_doc
</property>
<property name="connection.username">root</property>
<property name="connection.password">java</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect//方言确定连接的是哪个数据库
</property>
<property name="hbm2ddl.auto">update</property>//如改为create就重新创建表
<property name="show_sql">true</property>
<mapping resource="com/xasxt/entity/Document.hbm.xml" />
<mapping resource="com/xasxt/entity/User.hbm.xml" />//类的映射文件
</session-factory>
创建表的类如下:
public class SchemaExport {
public static void main(String[] args) {
org.hibernate.tool.hbm2ddl.SchemaExport export =
new org.hibernate.tool.hbm2ddl.SchemaExport(HibernateUtil.getConfiguration());
export.create(true, true);
}
}
Hibernate关联映射
Hibernate性能优化策略
u 一级缓存(session级别缓存):随着session关闭,缓存消失。
Ø ServletContext
Ø Iterator
Ø Get
List不利用缓存
查询某一列也没有缓存
管理一级缓存:一级缓存不能取消,可以管理。
ü close() clear() evict()
u 二级缓存(进程级别的)
Ø 首先,把ehcache.xml配置文件拷到WEB-INF下。
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
Ø 启用二级缓存,在hibernate配置文件中做如下修改:
<!-- 默认启用二级缓存 -->
<property name="cache.use_second_level_cache"></property>
<!-- 缓存提供商 -->
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<mapping resource="com/xasxt/entity/Document.hbm.xml" />
<mapping resource="com/xasxt/entity/User.hbm.xml" />
<class-cache usage="read-only" class="com.xasxt.entity.User"/>
Ø 在映射文件或hibernate配置文件中配置缓存存取策略。在映射文件添加以下配置(不推荐)<cache usage=”read-only”/>或者在hibernate.cfg.xml配置文件添加以下<class-cache usage="read-only" class="com.xasxt.entity.User"/>
配置
Ø List没有利用二级缓存
注意,在hbm的class配置中添加<cache>配置,表示的是类缓存,如果把这个配置删除,将只缓存ID,不缓存整个对象。(这个时候对list操作,也可能有n+1查询问题)
u 查询缓存(线程级别,默认关闭)在hibernate配置文件中做如下修改:
<!-- 设置查询缓存 -->
<property name="cache.use_query_cache">true</property>
Ø Iterator()没有利用查询缓存
Ø List()可以用查询缓存
Ø 所谓查询缓存,即让hibernate缓存list、iterator、createQuery等方法的查询结果集。如果没有打开查询缓存,hibernate将只缓存load方法获得的单个持久化对象。
Ø 在打开了查询缓存之后,需要注意,调用query.list()操作之前,必须显式调用query.setCachable(true)来标识某个查询使用缓存。
u 批量抓取
Ø 1.在多对一,或一对一关联中,利用load,get或iterator方法加载实体的代理对象,默认情况下在调用关联对象的get方法时,对会发出查询关联对象的查询语句,可以在多的一端或一对一的任意一端配置fetch=”join’,(此时设置batch-siza就不起作用了)此时加载实体的代理对象使用连接查询直接把关联对象可以抓取到客户端,减少发出查询个数,提高性能。
Ø 2.在一对多关联中一的一端,利用list()加载实体的集合时,默认情况下,发出调用集合中任意一个实体的关联集合的get方法时,才会发出查询语句关联的集合。可以在一的一端的set标签中配置batch-size=”number” 这样属性,指定一条查询批量加载的关联集合数量,减少发出的查询个数,提高性能。
Ø 3. fetch在一的一端有三种配置,除了select,join外,还有subselect,那么要记住:fetch="join",是给load,get,iterator方法使用的抓取策fetch="subselect"可以在使用list()抓取返回集合的关联集合时使用的抓取策略
Ø 在一对多关联映射中,在一的一端配置fetch="subselect",哪么在延迟加载的一
端对象所关联的集合时,可以利用一条查询一的一端所有ID的子查询,把关联一的
一端实体对象集合所关联的所有集合全部加载到缓存中,减少发出的查询语句,
提高性能。
<many-to-one name="user" class="User" column="uid" cascade="all" fetch="join" lazy="false"></many-to-one>
<set name="docs" cascade="all" inverse="true" batch-size="10" fetch="subselect/select/join">
<key column="uid"></key>
<one-to-many class="Document" />
</set>