一,SessionFactory
1,是线程安全的,它的同一个实例可以被多个线程共享。
2,是重量级的,不能随意创建或销毁它的实例,如果为应用同时访问多个数据库,则需要为每个数据库创建一个单独的SesisonFactory实例
//可用于自定义查询
<property name="total" formula="select count(*) from user as u"/>
二,OpenSessionInViewFilter
在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如 company.getEmployees(),否则Hibernate抛session already closed Exception; OpenSessionInView提供了一种简便的方法,较好地解决了lazy loading问题.
它有两种配置方式OpenSessionInViewInterceptor和 OpenSessionInViewFilter(具体参看SpringSide),功能相同,只是一个在web.xml配置,另一个在 application.xml配置而已。
Open Session In View在request把session绑定到当前thread期间一直保持hibernate session在open状态,使session在request的整个期间都可以使用,如在View层里PO也可以lazy loading数据,如 ${ company.employees }。当View 层逻辑完成后,才会通过Filter的doFilter方法或Interceptor的postHandle方法自动关闭session。
1,配置方式
application.xml
- <bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
- <property name="sessionFactory">
- <ref bean="sessionFactory"/>
- </property>
- </bean>
- <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <property name="interceptors">
- <list>
- <ref bean="openSessionInViewInterceptor"/>
- </list>
- </property>
- <property name="mappings">
- ...
- </property>
- </bean>
- -----------------------------------
一,hibernate提供三种缓存机制
1,默认的查询缓存区域:net.sf.hibernate.cache.StandardQueryCache
2,用户自定义的查询缓存区域:customerQuries
3,时间戳缓存区域:net.sf.hibernate.cache.UpdateTImestampCache
在查询区域存放查询缓存,时间戳区域存放与查询相关插入、更新缓存.在某一时刻进行查询时,先对比查询与更新这两块缓存的时间,看那个时刻的时间离这最近 如果查询的近,直接进行查询,不对数据库进行操作。如果删除、更新的近,删查询中相对应的,然后到数据库中查,再重新加入查询缓存。但是如果你手动修改数 据库,hibernate监视不到,这样一来他就会到查询缓存中找,这样就会数据不同步。可执行Query接口 setForceCacheRefresh(true)使查询缓存丢弃,重新查,重新加入查存。、、392存储过程的使用。批量更新删除不用 hibernate缓存,可以用jdbc,这样的话,就可以节省与缓存操作时间.但如果是批量查询的话,可以用缓存.
二,mysql有text blob与oracle有clob blob相对应。
三,可以再.hbm.xml中写相应的hql语句
<query name="findcustomerbyname"><![DATA[
from Customer c where c.name like :name
]]></query>
Query query=session.getNamedQuery("findcustomerbyname");
query.setString("name",name);
List result=query.list();