5

私はjsf2.0spring3.1とhibernate4.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

次のようなアノテーションを介して休止状態のセッションを取得する別の方法

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

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

春のapplicationContext.xmlのSessionFactoryBean

    <!--  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

サミラが上で述べたように、「HibernateDaoSupport」の代わりに「SessionFactory」を使用することは、新しい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ベースのデータアクセスコードの移行ヘルパーとして存在し、Hibernate4.xのバグ修正の恩恵を受けます。

ただし...Mkyong.comチュートリアルの1つでも、同じ問題に直面しました。

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

Spring4.2.4.RELEASEとHibernate4.3.8.Finalを使用しています。

(チュートリアルを起動/実行するための)私にとっての便利な解決策は、HibernateDaoSupportに対するSpring-ormの組み込みサポートを使用することです。具体的には、インポートの行を「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()メソッドをオーバーライドすることで、HibernateDAOサポートを使用できます。

このメソッドは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 に答える