Spring高级程序设计 11 Spring对Hibernate的支持

来源:互联网 发布:威尔逊主义 知乎 编辑:程序博客网 时间:2024/05/16 01:42
3Hibernate支持介绍 
Spring的LocalSessionFactoryBean的简化配置:
view plaincopy to clipboardprint?
  1. <context:property-placeholder location="classpath:jdbc.properties" />  
  2. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  
  3.     destroy-method="close">  
  4.     <property name="driverClassName" value="${driverClassName}"/>  
  5.     <property name="url" value="${url}"/>  
  6.     <property name="username" value="${username}"/>  
  7.     <property name="password" value="${password}"/>  
  8.     <property name="initialSize" value="${initialSize}"/>  
  9.     <property name="maxActive" value="${maxActive}"/>  
  10.     <property name="maxIdle" value="${maxIdle}"/>  
  11.     <property name="minIdle" value="${minIdle}"/>  
  12.     <property name="maxWait" value="${maxWait}"/>  
  13.     <property name="defaultAutoCommit" value="${defaultAutoCommit}"/>  
  14. </bean>  
  15.   
  16.   
  17. <bean id="sessionFactory"  
  18.     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  19.     <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>  
  20.     <property name="dataSource" ref="dataSource"></property>      
  21. </bean>  

使用HibernateTemplate或者使用HibernateDaoSupport: 
当然我们使用HibernateDaoSupport的时候,需要sessionFactory的注入,那么就可以先定义一个HibernateDaoSupport的抽象Spring bean,然后让继承HibernateDaoSupport的bean定义一个parent:
view plaincopy to clipboardprint?
  1. ....  
  2. <bean id="hibernateDaoSupport" abstract="true" class="org.springframework.orm.hibernate3.support.HibernateDaoSupport">  
  3.     <property name="sessionFactory" ref="sessionFactory"/>  
  4. </bean>  
  5. <bean id="helloHibernate" class="...." parent="hibernateDaoSupport"/>  
  6. ....  

这样做的好处在于helloHibernate可以省略下面两个东西:
view plaincopy to clipboardprint?
  1. <property name="dataSource" ref="dataSource"></property>  
  2. <property name="hibernateTemplate" ref="hibernateTemplate"></property>  








4在企业级应用程序中使用Hibernate 
1、阻止更新脏数据
 
参照《hibernate 控制并发访问》http://blog.csdn.net/partner4java/article/details/6926546 




2、对象等价性 
当我们在Hibernate中使用持久化集合时,比如set。那么就需要考虑等价性。实现自然等价或者数据库等价。 
主要是根据业务需求重载hashcode和equals 


3、事务支持 
使耽搁DAO方法具有事务性不是一个好的实战,因为他讲在服务层智商定义事务的边界。DAO层应该是一个域对象和一些数据存储方式间的简单转换器。 
配置文件,添加事务支持:
view plaincopy to clipboardprint?
  1. <context:property-placeholder location="classpath:jdbc.properties" />  
  2. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  
  3.     destroy-method="close">  
  4.     <property name="driverClassName" value="${driverClassName}"/>  
  5.     <property name="url" value="${url}"/>  
  6.     <property name="username" value="${username}"/>  
  7.     <property name="password" value="${password}"/>  
  8.     <property name="initialSize" value="${initialSize}"/>  
  9.     <property name="maxActive" value="${maxActive}"/>  
  10.     <property name="maxIdle" value="${maxIdle}"/>  
  11.     <property name="minIdle" value="${minIdle}"/>  
  12.     <property name="maxWait" value="${maxWait}"/>  
  13.     <property name="defaultAutoCommit" value="${defaultAutoCommit}"/>  
  14. </bean>  
  15.   
  16.   
  17. <bean id="sessionFactory"  
  18.     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  19.     <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>  
  20.     <property name="dataSource" ref="dataSource"></property>      
  21. </bean>  
  22.   
  23. <bean id="transactionManager"  
  24.     class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  25.     <property name="sessionFactory" ref="sessionFactory"></property>      
  26. </bean>  
  27.   
  28. <!-- 事务通知 -->  
  29. <tx:advice id="txAdvice" transaction-manager="transactionManager">  
  30.     <tx:attributes>  
  31.         <tx:method name="new*" propagation="REQUIRED" isolation="DEFAULT" />  
  32.         <tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT" />  
  33.         <tx:method name="update*" propagation="REQUIRED" isolation="DEFAULT" />  
  34.         <tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT" />  
  35.         <tx:method name="bulk*" propagation="REQUIRED" isolation="DEFAULT" />  
  36.         <tx:method name="load*" propagation="REQUIRED" isolation="DEFAULT" read-only="true"/>  
  37.         <tx:method name="get*" propagation="REQUIRED" isolation="DEFAULT" read-only="true"/>  
  38.         <tx:method name="query*" propagation="REQUIRED" isolation="DEFAULT" read-only="true"/>  
  39.         <tx:method name="find*" propagation="REQUIRED" isolation="DEFAULT" read-only="true"/>  
  40.         <tx:method name="is*" propagation="REQUIRED" isolation="DEFAULT" read-only="true"/>  
  41.           
  42.         <tx:method name="*" propagation="SUPPORTS" isolation="DEFAULT" />  
  43.     </tx:attributes>  
  44. </tx:advice>  
  45. <aop:config>  
  46.         <aop:advisor pointcut="execution(* *..*Service*.*(..))" advice-ref="txAdvice" />  
  47. </aop:config>  



4、延迟加载 
只是在需要的时候抓取数据。 

原创粉丝点击