hibernate代码优化小技巧

多对多集联关系查询
  用户和角色两表
  在用户表中查询角色信息
用户表实体
private Set<Role> roleSet = new HashSet<Role>(); 
用户表映射关系配置
      <set name="roleSet" table="(1)t_userrole" (2)order-by="id desc" (3)inverse="true">
          <key column="(4)userId"/> 
            <many-to-many class="(5)com.baidu.zh.model.role.Role" column="(6)roleId"/> 
        </set>

(1)中间表 (2)在进行查询是由于set无序所以排序了,(3)控制反转,在这里设为“false时,当表关联后,如果我对用户表进行修改,则将发出一条删除语句,把中间表中的信息删除,(4)用户表中关联的键 (5)角色实体类(角色关联外键)

代码优化:当进行链表查询时 必须将 lazy=”false”,才能查到角色中的信息,负责就会报错,但加上这个属性,查询次数较多,所以一般不用添加而有其他办法:

首先:在web.xml中配置
  <filter>
  <filter-name>openSessionInView</filter-name>
  <filter-class>org.springframework.orm.hibernate3.support.OpenSession      InViewFilter</filter-class>
  </filter>
   <filter-mapping>
  <filter-name>openSessionInView</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>


下面来说说 缓存 我用的是 ehcache
(1)下载解压后 将导入 ehcache-core-2.4.3.jar
(2) ehcache.xml文件 放在src下
   <?xml version="1.0" encoding="UTF-8"?>
<ehcache>
    <!--
        缓存到硬盘的路径
    -->
    <diskStore path="e:/ehcache"></diskStore>
   
    <!--
        默认设置
        maxElementsInMemory : 在內存中最大緩存的对象数量。
        eternal : 缓存的对象是否永远不变。
        timeToIdleSeconds :可以操作对象的时间。
        timeToLiveSeconds :缓存中对象的生命周期,时间到后查询数据会从数据库中读取。
        overflowToDisk :内存满了,是否要缓存到硬盘。
    -->
    <defaultCache maxElementsInMemory="1" eternal="false"
        timeToIdleSeconds="500" timeToLiveSeconds="600" overflowToDisk="true"></defaultCache>
       
    <!--
        指定缓存的对象。
        下面出现的的属性覆盖上面出现的,没出现的继承上面的。
    -->
</ehcache>

(3)在hibernate.cfg.xml文件中的配置
    <!-- <property name="hibernate.hbm2ddl.auto">update</property> -->
<property name="cache.use_second_level_cache">true</property>
<property   name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<property name="cache.use_query_cache">true</property>
(4)在映射文件中的配置
     比如我们对菜单树要做缓存
我们就必须加上  <class-cache class="com.baidu.zhangy.model.menu.Menu" usage="read-write"/>
(5)查询时:query.setCacheable(true);

  这样就设置好了,我们在平台上打印的sql 就减少了一大半。