5

Java構成を使用してSessionFactoryを作成するにはどうすればよいですか?

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

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

4

5 に答える 5

12

代わりに工場を返します:

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

コードのどこかに直接注入する必要がある場合はSessionFactory、次のヘルパー メソッドを追加します。

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

ヘルパーsessionFactory()には注釈が付けられていない@Beanことに注意してください。これは非常に重要です。

于 2011-11-14T12:21:37.703 に答える
6

Tomaszは正しいですが、「new」を使用してオブジェクトインスタンスを作成することは、Springの概念に適合しないと私は信じています。

私はあなたがこのようにする必要があると思います:

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

その後、SpringBean内で使用できます。

@Autowired
    SessionFactory sessionFactory;

次に、メソッドの内部:

Session session = sessionFactory.getCurrentSession();
于 2011-11-14T12:26:22.463 に答える
5

ここで注目に値するのは、Spring 3.1 が 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+ のみであることに注意してください。

于 2011-11-14T18:20:53.193 に答える
4

上記の回答は古くなっているため、より現代的なアプローチを次に示します。

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

また、を挿入した場合EntityManagerは、現在のセッションを次の方法で取得できます

Session session = entityManager.unwrap(Session.class);
于 2017-02-16T21:34:17.140 に答える
1

すべてのプロパティを設定した後、セッション ファクトリで afterPropertiesSet() を呼び出す必要があります。

したがって、あなたの例では次のようになります。

@Bean
public SessionFactory sessionFactory(){
    AnnotationSessionFactoryBean sessionFactoryBean = new AnnotationSessionFactoryBean();
    sessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml"));
    sessionFactoryBean.afterPropertiesSet();
    return sessionFactoryBean.getObject();
}
于 2013-01-30T04:00:49.260 に答える