Spring Hibernate SessionFactory

时间:2011-11-14 12:18:14

标签: hibernate spring sessionfactory

如何使用java配置创建SessionFactory?

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

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

5 个答案:

答案 0 :(得分: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进行注释 - 这非常重要。

答案 1 :(得分:5)

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();

答案 2 :(得分:3)

值得注意的是,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()方法等的尴尬需求.PoolBeans非常适合在XML中使用,但在@Bean方法中却不理想。

请注意,这个新构建器仅限Hibernate 4.1+。

答案 3 :(得分:2)

由于上述答案已经过时,这是一种更现代的方法:

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

另外,如果您注入EntityManager,则可以通过

获取当前会话
Session session = entityManager.unwrap(Session.class);

答案 4 :(得分:1)

在设置所有属性

后,您应该在会话工厂上调用afterPropertiesSet()

所以在你的例子中它看起来像:

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