在Spring 3之前注入Hibernate会话的最佳方法

时间:2011-01-15 11:42:01

标签: java hibernate spring

我不确定使用Spring3将Hibernate的会话实例注入DAO类的最佳方法。我没有使用Spring的Hibernate Template支持,所以这里是我在DAO类中的代码。

public void setSessionFactory(SessionFactory sessionFactory){
    this.sessionFactory=sessionFactory;
}


public SessionFactory getSessionFactory(){
    log.info("Returning a refrence to the session instance");
    if(sessionFactory==null){
         log.error("Not able to find any associated session");
         throw new RuntimeException("Not able to find any associated session");
    }
    return sessionFactory;
}

以下是将会话注入此方法的代码

<bean id="genericSessionFactory" class="HibernateSessionFactory"
        factory-method="getSessionfactory" scope="prototype/>

我不确定这是否是进行SessionFactory注入的最佳方式,因为我们不想在项目中使用Spring Template。 所以任何其他改进建议都会有所帮助。

4 个答案:

答案 0 :(得分:22)

skaffman的帖子和Sean的组合以及注释的使用。

@Respository("productDao")
public class ProductDaoImpl implements ProductDao {

    @Autowired
        private SessionFactory sessionFactory;

            public Collection loadProductsByCategory(String category) {
                    return this.sessionFactory.getCurrentSession()
                        .createQuery(
                            "from test.Product product where product.category=?")
                        .setParameter(0, category)
                        .list();
        }
}

XML

<beans>

  <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
    <property name="url" value="jdbc:hsqldb:hsql://localhost:9001"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>
  </bean>

  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource"/>
    <property name="mappingResources">
      <list>
        <value>product.hbm.xml</value>
      </list>
    </property>
    <property name="hibernateProperties">
      <value>
        hibernate.dialect=org.hibernate.dialect.HSQLDialect
      </value>
    </property>
  </bean>

</beans>

答案 1 :(得分:20)

Spring Reference suggests this usage

public class ProductDaoImpl implements ProductDao {

    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    public Collection loadProductsByCategory(String category) {
        return this.sessionFactory.getCurrentSession()
                .createQuery(
                    "from test.Product product where product.category=?")
                .setParameter(0, category)
                .list();
    }
}

这样你的类与Spring没有任何依赖关系,你只需使用普通的Hibernate。

答案 2 :(得分:19)

你过度复杂了。

请不要使用那种在Hibernate文档中不断出现的糟糕HibernateUtil模式。 Spring提供了一种更好,更好的方法来配置Hibernate SessionFactory - LocalSessionFactoryBeansee docs for example usage)。

LocalSessionFactoryBean生成一个SessionFactory对象,您可以将其作为属性注入DAO bean。

Spring很高兴您不使用HibernateDaoSupportHibernateTemplate - 有section of the docs解释如何很好地完成这项工作。

答案 3 :(得分:12)

使用Hibernate的可行方法是通过JPA(hibernate-entitymanager):

@PersistenceContext
private EntityManager entityManager;

applicationContext.xml

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="yourUnitName" />
    <property name="dataSource" ref="dataSource" /> <!-- needs a data source bean -->
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="${hibernate.dialect}" />
        </bean>
    </property>
</bean>



<bean id="transactionManager" 
  class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

你需要一个META-INF/persistence.xml