hibernate spring与最新版本集成

时间:2011-08-23 09:10:39

标签: java hibernate spring

您在下面的论坛中找到了不使用Spring hibernate模板的信息:

http://forum.springsource.org/showthread.php?111771-what-is-the-difference-between-hibernate-template-and-hibernate-dao-support

它说:

  

自hibernate 3.0.1以来,不再需要HibernateTemplate,   从那个版本开始,它变得更容易插入很好地休眠,   在那之前春天需要一些技巧,代理和hackery来管理   事务,线程绑定会话和异常转换。现在   使用不再需要的更新版本的hibernate,你   仍然得到所有好东西异常翻译,会话管理   等但不使用任何春季特定类。哪个是imho   非常好,它使弹簧的使用更加突兀。

我使用了HibernateTemplate和Dao支持,是否需要在新的应用程序中使用这些API?

我可以使用最新的示例代码将Hibernate与Spring框架集成。

2)

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/orm.html#orm-hibernate-straight

除了将SessionFactory保存在实例变量中之外,此样式类似于Hibernate参考文档和示例的样式。我们强烈建议在Hibernate的CaveatEmptor示例应用程序中使用老式静态HibernateUtil类进行基于实例的设置。

因为很多地方我们都在使用SessionFactory,这是从早些时候开始使用HibernateUtil的最佳方式吗?

2 个答案:

答案 0 :(得分:2)

在以前的Spring版本中,模板模型用于为许多不同的框架(Hibernate,JPA,JMS等)提供通用抽象。虽然这使得开发变得简单,但它也将您的业务代码与Spring Framework联系起来。 Spring 3.x的目标之一是将您的应用程序代码与Spring分离,要求您尽可能少地使用特定于Spring的代码,从而使您的代码更具可重用性。

  

推荐的集成方式是针对plain编写DAO代码   Hibernate,JPA和JDO API。使用Spring的DAO的旧式   不再推荐使用模板;但是,这种风格的报道   可以在第A.1节“经典ORM用法”中找到   附录。
  [Source]

Spring提供的增强功能(事务管理,异常翻译等)现在通过AOP发生,您不必在代码中担心它。该机制描述于:

  

13.3.2. Implementing DAOs based on plain Hibernate 3 API

中涵盖了传统方法
  

Classic ORM Usage: A.1.1.1 The HibernateTemplate

答案 1 :(得分:1)

使用Hibernate Session Factory代替Hibernate Template:

public abstract class HomeSessionFactory {

   @Autowired
protected SessionFactory sessionFactory;

}

将此类在xxDAOImpl文件中扩展为。

@Repository("LoginDetailsDAO")
@Transactional
public class LoginDetailsDAOImpl extends HomeSessionFactory implements LoginDetailsDAO {
    @SuppressWarnings("unchecked")
    @Transactional(readOnly = true)
    public List<UserLogin> loginDetails(UserLogin login) {
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        List<UserLogin> result = session.createQuery("from UserLogin").list();
        transaction.commit();
        return result;
    }
}

Spring Context文件:

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
    <property name="annotatedClasses">
        <list>
            <value>com.home.app.model.UserLogin</value>
        </list>
    </property>
</bean>
<bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>properties/database.properties</value>
    </property>
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>