Spring Hibernate SessionFactory

DD.*_*DD. 4 spring hibernate sessionfactory

如何使用java配置创建SessionFactory?

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

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

Tom*_*icz 12

返回工厂:

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

如果需要SessionFactory在代码中直接注入,请添加此辅助方法:

public SessionFactory sessionFactory() {
    return sessionFactoryBean().getObject();
}
Run Code Online (Sandbox Code Playgroud)

请注意,帮助sessionFactory()程序没有注释@Bean- 这非常重要.


dan*_*nik 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>
Run Code Online (Sandbox Code Playgroud)

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

@Autowired
    SessionFactory sessionFactory;
Run Code Online (Sandbox Code Playgroud)

然后在你的方法内:

Session session = sessionFactory.getCurrentSession();
Run Code Online (Sandbox Code Playgroud)

  • 他正在使用[基于Java的容器配置](http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-java),这是新的Spring 3.0.x的特性.OP的代码是完全正确和惯用的(除了他面临的问题,当然). (2认同)

Chr*_*ams 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+。