5

我是 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

4 回答 4

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;

    }
}
于 2012-06-25T11:56:27.333 回答
3

Another way to get hibernate session via annotation like following

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

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

SessionFactory bean in spring applicationContext.xml

    <!--  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>
于 2013-04-17T06:47:13.717 回答
1

正如 Samira 上面所说,将“SessionFactory”替换为“HibernateDaoSupport”是任何新 Spring/Hibernate 代码的“正确方法”:

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

注意:Hibernate 访问代码也可以用普通的 Hibernate 样式编码。因此,对于新启动的项目,请考虑采用基于 SessionFactory.getCurrentSession() 的标准 Hibernate 编码数据访问对象的风格。这个 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 的内置支持。具体来说,我只是将导入的行从“hibernate3”更改为“hibernate4”:

StockDaoImpl.java =>

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

万一有人遇到同样的问题:)

于 2016-02-04T21:17:38.907 回答
-1

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

在 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();
    }
}

以下可用于示例

于 2014-01-04T07:15:39.610 回答