HibernateDaoSupport在hibernate 4.0中

时间:2012-06-25 11:37:31

标签: java spring hibernate java-ee

我是jsf 2.0 spring 3.1和hibernate 4.1集成的新手。如何更改以下代码,因为hibernate 4.0不包含HibernateDaoSupport。

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;


    public class CustomerDaoImpl extends 
           HibernateDaoSupport implements CustomerDao{

        public void addCustomer(Customer customer){

            customer.setCreatedDate(new Date());
            getHibernateTemplate().save(customer);

        }

        public List<Customer> findAllCustomer(){

            return getHibernateTemplate().find("from Customer");

        }
    }

我正在尝试这个示例:http://www.mkyong.com/jsf2/jsf-2-0-spring-hibernate-integration-example/

4 个答案:

答案 0 :(得分:12)

我找到了解决方案。我应该使用会话工厂。

import java.util.List;

import org.hibernate.SessionFactory;

public class CustomerDaoImpl implements CustomerDao{
    private SessionFactory sessionFactory;
    public SessionFactory getSessionFactory() {
        return sessionFactory;}
    public void setSessionFactory(SessionFactory sessionFactory) {
         this.sessionFactory = sessionFactory;
    }

    public void addCustomer(Customer customer){


        getSessionFactory().getCurrentSession().save(customer);

    }

    public List<Customer> findAllCustomer(){

        List list = getSessionFactory().getCurrentSession().createQuery("from Customer").list();
        return list;

    }
}

答案 1 :(得分:3)

通过注释获得hibernate会话的另一种方法,如下面的

@Autowired
@Qualifier("sessionFactory")
private SessionFactory sessionFactory;

public Session getSession() {
    return sessionFactory.getCurrentSession();
}

Spring applicationContext.xml中的SessionFactory bean

    <!--  sessionFactory -->
    <bean id="sessionFactory"
          class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="packagesToScan">
            <list>
                <value></value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props></props>
        </property>
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
    </bean>

答案 2 :(得分:1)

正如萨米拉上面所说的那样,取代了#34; SessionFactory&#34; for&#34; HibernateDaoSupport&#34;是正确的方法&#34;对于任何新的Spring / Hibernate代码:

  

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/orm/hibernate4/support/HibernateDaoSupport.html

     

注意:Hibernate访问代码也可以在普通的Hibernate中编码   样式。因此,对于新开工项目,请考虑采用   标准的Hibernate风格的编码数据访问对象取而代之   在SessionFactory.getCurrentSession()上。这个HibernateTemplate   主要作为基于Hibernate 3的数据的迁移帮助程序存在   访问代码,从Hibernate 4.x中的错误修复中受益。

但是......我也在一个Mkyong.com教程中遇到了同样的问题:

http://www.mkyong.com/spring/maven-spring-hibernate-mysql-example/

我使用的是Spring 4.2.4.RELEASE和Hibernate 4.3.8.Final。

对我来说(使教程启动/运行)的权宜之计是使用Spring-orm对HibernateDaoSupport的内置支持。具体来说,我只是改变了来自&#34; hibernate3&#34;的导入。到&#34; hibernate4&#34;:

StockDaoImpl.java =&gt;

package com.mkyong.stock.dao.impl;
...
// import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
...

如果有人遇到同样的问题:)

答案 3 :(得分:-2)

您可以通过扩展HibernateDAOSupport类并覆盖其afterPropertiesSet()方法来使用Hibernate DAO Support。

在HibernateDAO支持中调用此方法,此时由于sessionFactory为null,因此抛出此错误。在您的自定义类中,您可以显式设置此属性,然后调用父类的相同方法(即HibernateDAOSupport的addProperties()方法)

package com.techcielo.spring4.hibernate.template;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;

@Component("hibernateTemplate")
public class Hibernate4CustomTemplate extends HibernateTemplate{

    @Autowired(required=true)
    private SessionFactory sessionFactory;
    public void setSessionFactory(SessionFactory sessionFactory) {
        System.out.println("Setting SessionFactory");
        this.sessionFactory = sessionFactory;
        super.setSessionFactory(sessionFactory);
    }

    @Override
    public void afterPropertiesSet() {
    System.out.println("Checking if properties set..."+this.sessionFactory);
    setSessionFactory(sessionFactory);
    super.afterPropertiesSet();
    }
}

以下内容可用于sample