Spring Hibernate SessionFactory

Posted

技术标签:

【中文标题】Spring Hibernate SessionFactory【英文标题】: 【发布时间】:2011-12-28 14:50:59 【问题描述】:

如何使用 java 配置创建 SessionFactory?

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

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

【问题讨论】:

【参考方案1】:

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

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

另外,如果你注入了EntityManager,你可以通过

Session session = entityManager.unwrap(Session.class);

【讨论】:

【参考方案2】:

你应该在设置完所有属性后调用会话工厂的 afterPropertiesSet()

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

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

【讨论】:

【参考方案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() 方法等的尴尬需要。FactoryBeans 非常适合用于 XML,但不适用于 @Bean 方法。

请注意,此新构建器仅适用于 Hibernate 4.1+。

【讨论】:

【参考方案4】:

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

【讨论】:

他使用的是Java-based container configuration,这是Spring 3.0.x的新特性。 OP 的代码完全没问题,而且非常地道(当然,除了他面临的问题)。【参考方案5】:

改为返回工厂:

@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 注释 - 这非常重要。

【讨论】:

这对我有用,但我很困惑 bean 需要放在哪里。对于其他人,如果您有一个包含带有“@Configuration”注释的类,我会将“@Bean”方法放在那里。加载没问题,我很高兴。 AbstractSessionFactoryBean 已弃用

以上是关于Spring Hibernate SessionFactory的主要内容,如果未能解决你的问题,请参考以下文章

spring4整合hibernate5以及出现的问题解决办法

hibernate

增删改查

Hibernate4获得Session

EasyUI 页面分页

Intellij idea生成Hibernate实体类