Hibernate---基础理解+OpenSessionInViewFilter
?
一,SessionFactory
??1,是线程安全的,它的同一个实例可以被多个线程共享。
2,是重量级的,不能随意创建或销毁它的实例,如果为应用同时访问多个数据库,则需要为每个数据库创建一个单独的SesisonFactory实例
? //可用于自定义查询
??<propertyname="total"? formula="select count(*) from useras u"/>
二,OpenSessionInViewFilter
?? 在没有使用Spring提供的Open SessionIn View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading为true的话,要在应用层内把关系集合都初始化,如company.getEmployees(),否则Hibernate抛session already closedException;???OpenSessionInView提供了一种简便的方法,较好地解决了lazyloading问题.?????
???它有两种配置方式OpenSessionInViewInterceptor和OpenSessionInViewFilter(具体参看SpringSide),功能相同,只是一个在web.xml配置,另一个在application.xml配置而已。????
????Open Session In View在request把session绑定到当前thread期间一直保持hibernatesession在open状态,使session在request的整个期间都可以使用,如在View层里PO也可以lazyloading数据,如 ${ 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语句
<queryname="findcustomerbyname"><![DATA[
????from Customer c where c.name like :name
]]></query>
Query query=session.getNamedQuery("findcustomerbyname");
query.setString("name",name);
List result=query.list();
?