12

次のような例外が発生します。

java.lang.IllegalArgumentException: 'sessionFactory' または 'hibernateTemplate' が必要です

@RepositoryHibernateDaoSupport クラスでアノテーションを使用しようとしたとき。エラー メッセージは簡単です。リポジトリを作成するには、sessionFactory が必要です。ただし、XML でセッション ファクトリを定義しました。

<!-- Hibernate -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dashDataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.mycomp.myapp.Category</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            </props>
        </property>
    </bean>

そのため、アノテーション駆動型 Bean の作成中に必要な SessionFactory をリポジトリに与える方法がわかりません。次のことを試みました。

 @Autowired
    protected HibernateTemplate createHibernateTemplate(SessionFactory sessionFactory) {
        return super.createHibernateTemplate(sessionFactory);
    }

しかし、これは問題を解決しません。これは、アクションを実行するときだけでなく、インスタンス化中にリポジトリがそのプロパティを必要とするためと考えられます。残念ながら、@Autowired アノテーションでオーバーライドするコンストラクターや初期化メソッドがないため、この問題を回避する方法がわかりません。

sessionFactory Bean が作成され、Autowired できることを確認しましたが、問題ありません。

4

2 に答える 2

36

HibernateDaoSupportSessionFactoryを介して供給されsetSessionFactory()ます。ただし、setSessionFactory()はであるため、注釈finalを追加するためにオーバーライドすることはできません。ただし、任意のメソッドに適用して、そこから呼び出す@Autowiredことができます。@AutowiredsetSessionFactory()

@Autowired
public void init(SessionFactory factory) {
    setSessionFactory(factory);
}
于 2010-07-12T17:56:20.147 に答える
6

@Qualifier注釈を使用して、使用するセッション ファクトリを定義することもできます (複数ある場合など) 。

@Autowired
public MyClassImpl(@Qualifier("myOtherSessionFactory") SessionFactory sessionFactory) {
    setSessionFactory(sessionFactory);
}

を拡張して、データ ソースを切り替えることもできますAbstractRoutingDataSourceこのページを参照してください。

于 2011-02-04T18:30:44.947 に答える