2011-11-14 3 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을 반환합니다. 대신

답변

3

여기서는 Spring 3.1이 @Bean 메소드 내에서 사용하도록 명시 적으로 고안된 LocalSessionFactoryBuilder를 소개합니다.

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 이상에서만 작동합니다.

10

반환 공장 : 도우미 sessionFactory()@Bean 주석하지것을

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

참고 : 코드에서 직접 어딘가에 SessionFactory를 주입해야하는 경우

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

이 도우미 메서드를 추가 - 이것은 정말로 중요합니다.

+0

이것은 나를 위해 일했으나 콩을 놓을 곳이 어디 있는지 혼란 스러웠습니다. 다른 사람들을 위해 '@Configuration'이라는 주석이 포함 된 클래스가 있다면 거기에 '@Bean'메서드를 넣을 것입니다. 어떤 문제도 올리지 않았다. 그리고 나는 가기 위해 즐거웠다. –

+0

AbstractSessionFactoryBean은 더 이상 사용되지 않습니다. – Blauhirn

5

토마스는 바로,하지만 난 사용하여 객체 인스턴스를 만들 것으로 믿는다 "새로운"하지 않습니다 봄 개념 피트 : 다음

<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> 

과 :

난 당신이 이런 식으로 할 필요가 있다고 생각 안쪽에 당신의 방법을 다음

@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

가 여기에 현대의 방법 : 당신가 EntityManager를 주입 한 경우

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

또한, 당신은

을 통해 현재의 세션을 얻을 수 있습니다
Session session = entityManager.unwrap(Session.class);