2011-11-14 28 views
4

java configを使用してSessionFactoryを作成するにはどうすればよいですか?Spring Hibernate SessionFactory

@Bean 
public SessionFactory sessionFactory(){ 
    AnnotationSessionFactoryBean sessionFactoryBean = new AnnotationSessionFactoryBean(); 
    sessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml")); 
    return sessionFactoryBean.getObject(); 
} 

これは何らかの理由で機能しません...常にnullを返します。代わりに

答えて

3

ここで注目すべき点は、Spring 3.1ではLocalSessionFactoryBuilderが導入されていることに注意してください。LocalSessionFactoryBuilderは、@Beanメソッド内で使用するように明示的に設計されています。

http://static.springsource.org/spring/docs/3.1.0.RC1/javadoc-api/org/springframework/orm/hibernate4/LocalSessionFactoryBuilder.html

これはFactoryBeansに対処するための厄介な必要性を回避しては、getObject()メソッドなどFactoryBeansは、XMLでの使用に優れているが、@Bean方法で非理想的。

この新しいビルダーは、Hibernate 4.1以上であることに注意してください。

10

戻り工場:ヘルパーsessionFactory()@Beanと注釈を付けていないであることを

public SessionFactory sessionFactory() { 
    return sessionFactoryBean().getObject(); 
} 

注:コード内で直接どこかSessionFactoryを注入する必要がある場合は

@Bean 
public AbstractSessionFactoryBean sessionFactoryBean(){ 
    AnnotationSessionFactoryBean sessionFactoryBean = new AnnotationSessionFactoryBean(); 
    sessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml")); 
    return sessionFactoryBean; 
} 

は、このヘルパーメソッドを追加します - これは本当に重要です。

+0

これは私のために働いたが、どこに置く必要があるのか​​混乱していた。他には、@Configurationというアノテーションを含むクラスがある場合、そこに '@Bean'メソッドを配置します。問題を積んだと私は行くのが良かった。 –

+0

AbstractSessionFactoryBeanは非推奨です – Blauhirn

5

トマシュは正しいですが、私は使用してオブジェクトのインスタンスを作成すると信じています「新しい」しないの春のコンセプトと足:その後、

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="hibernateProperties"> 
<props> 
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
    <prop key="hibernate.show_sql">true</prop> 
    <prop key="hibernate.hbm2ddl.auto">update</prop> 
    <prop key="hibernate.show_sql">true</prop> 
    </props> 
    </property> 
     <property name="annotatedClasses"> 
     <list> 
     <value>com.vanilla.objects.Student</value> 
     <value>com.vanilla.objects.Address</value> 

     </list> 
    </property> 
    </bean> 

<bean id="transactionManager" 
      class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 

と:

私はあなたがこのようにそれを行うために必要があると思いますあなたのSpring Beanの内側にそれを使用することができます。

@Autowired 
    SessionFactory sessionFactory; 

、その後、あなたの方法の内側:

Session session = sessionFactory.getCurrentSession(); 
+2

彼は[Javaベースのコンテナ構成](http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-java)を使用しています。これはSpring 3.0.xの新機能です。 OPのコードは完全に上質で慣用的です(もちろん、彼が直面している問題は除きます)。 –

2

あなたはすべてのプロパティ

は、だからあなたの例では、それは次のようになり設定した後にセッションファクトリにafterPropertiesSet()を呼び出す必要があります:上記の答えは時代遅れなので

@Bean 
public SessionFactory sessionFactory(){ 
    AnnotationSessionFactoryBean sessionFactoryBean = new AnnotationSessionFactoryBean(); 
    sessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml")); 
    sessionFactoryBean.afterPropertiesSet(); 
    return sessionFactoryBean.getObject(); 
} 
0

、ここではより近代的ですアプローチ:あなたはEntityManagerを注入してしまった場合

@Bean 
public SessionFactory sessionFactory(HibernateEntityManagerFactory hemf){ 
    return hemf.getSessionFactory(); 
} 

また、あなたが

経て現在のセッションを取得することができます
Session session = entityManager.unwrap(Session.class); 
関連する問題