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的主要内容,如果未能解决你的问题,请参考以下文章