5

如何使用 java 配置创建 SessionFactory?

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

由于某种原因,这不起作用......它总是返回空值。

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>

然后你可以在你的 Spring bean 中使用它:

@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 回答