zoukankan      html  css  js  c++  java
  • 是该抛弃Spring HibernateTemplate的时候了

    今天看Alef Arendsen的一篇blog。一点收获! 
    http://blog.interface21.com/main/2007/06/26/so-should-you-still-use-springs-hibernatetemplate-andor-jpatemplate/ 

    在spring2.0之前,我们在使用hibernate和spring的时候,都会被HibernateTemplate为我们提供 benefits(资源和事务管理以及把那个“丑陋”的checked exception转换为runtime exception-DataAccessException )而折服,在项目中不由自主、不假思索地使用它和那个经典的callback方法。而如今,hibernate3.0.1+ 、spring 2.0+版本以后,我们可以在数据访问层直接使用hinberate的session API(例如SessionFactory.getCurrentSession),不并担心session和transaction management。至于error handling可以通过spring的@Repository annotation和post processor-PersistenceExceptionTranslationPostProcessor来解决。让我们来看一些代码片段: 
    配置文件片段: 
    Java代码  收藏代码
    1. <bean id="sessionFactory" class="org.springframework.orm.hibernate3.  
    2. LocalSessionFactoryBean">  
    3. <!-- the properties setting-->  
    4. </bean>  
    5.    
    6. <bean id="accountRepo" class="com.mycompany.HibernateAccountRepository">  
    7. <constructor-arg ref="sessionFactory"></constructor-arg>  
    8. </bean>  
    9. <bean class="org.springframework.dao.annotation. PersistenceExceptionTranslationPostProcessor"/>  


    数据访问层代码片段: 
    Java代码  收藏代码
    1. @Repository  
    2. public class HibernateAccountRepository implements AccountRepository {  
    3.    
    4. private SessionFactory factory;  
    5.    
    6. public HibernateAccountRepository(SessionFactory factory) {  
    7. this.factory = factory;  
    8. }  
    9.    
    10. public Account loadAccount(String username) {  
    11. return (Account)factory.getCurrentSession()  
    12. .createQuery("from Account acc where acc.name = :name")  
    13. .setParameter("name", "thethirdpart").uniqueResult();  
    14. }  
    15. }  


    在xml配置文件里面通过配置的post processor会自动检测@Repository标注的bean并为该bean打开exception转换功能。 

    如果不支持annotations,可以通过AOP来实现,更方便 
    Java代码  收藏代码
    1. <bean id=“persistenceExceptionInterceptor”  
    2. class=“org.springframework.dao.support.PersistenceExceptionTranslationInterceptor”/>  
    3. <aop:config>  
    4.     <aop:advisor pointcut=“execution(* *..*Repository+.*(..))”  
    5.                           advice-ref=“persistenceExceptionInterceptor” />  
    6. </aop:config>  



    总结,我们应该选择哪种方式呢?还是那句话,根据不同的情况来做最正确的选择。但我建议是丢弃template,而直接使用hibernate的API,毕竟灵活性更大,更何况遇到复杂的情况我们始终得面对hibernate的API。spring并不强制你做任何事情,记得它是一个非侵入性的framework。
  • 相关阅读:
    hdu 1028 Ignatius and the Princess III (n的划分)
    CodeForces
    poj 3254 Corn Fields (状压DP入门)
    HYSBZ 1040 骑士 (基环外向树DP)
    PAT 1071 Speech Patterns (25)
    PAT 1077 Kuchiguse (20)
    PAT 1043 Is It a Binary Search Tree (25)
    PAT 1053 Path of Equal Weight (30)
    c++ 常用标准库
    常见数学问题
  • 原文地址:https://www.cnblogs.com/chenying99/p/2511168.html
Copyright © 2011-2022 走看看