2011-11-14 44 views
4

如何使用java配置创建SessionFactory?Spring Hibernate SessionFactory

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

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

回答

10

返回工厂来代替:

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

如果您需要在代码中注入SessionFactory直接某处,加上这helper方法:

public SessionFactory sessionFactory() { 
    return sessionFactoryBean().getObject(); 
} 

注意,助手sessionFactory()@Bean注解 - 这真的很重要。

+0

这对我有效,但我很困惑,需要放置bean的位置。对于其他人,如果你有一个包含'@Configuration'注解的类,我会把'@Bean'方法放在那里。加载没有问题,我很好去。 –

+0

AbstractSessionFactoryBean已弃用 – Blauhirn

5

托马斯是正确的,但我相信,通过创建对象实例“新”不脚与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

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

2

你应该设置所有属性

后的会话工厂调用的afterPropertiesSet()因此,在你的例子看起来会像:

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

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

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

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

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