如何使用java配置创建SessionFactory?
@Bean
public SessionFactory sessionFactory(){
AnnotationSessionFactoryBean sessionFactoryBean = new AnnotationSessionFactoryBean();
sessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml"));
return sessionFactoryBean.getObject();
}
由于某种原因,这不起作用......它总是返回null。
答案 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方法中使用而设计。
这解决了处理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();
}