복붙노트

[SPRING] Spring Hibernate SessionFactory

SPRING

Spring Hibernate SessionFactory

java config를 사용하여 SessionFactory를 어떻게 만듭니 까?

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

이것은 어떤 이유로 작동하지 않습니다 ... 항상 null을 반환합니다.

해결법

  1. ==============================

    1.Spring 3.1에는 @Bean 메소드 내에서 사용하도록 명시 적으로 고안된 LocalSessionFactoryBuilder가 도입되었다는 점에 유의해야한다.

    Spring 3.1에는 @Bean 메소드 내에서 사용하도록 명시 적으로 고안된 LocalSessionFactoryBuilder가 도입되었다는 점에 유의해야한다.

    http://static.springsource.org/spring/docs/3.1.0.RC1/javadoc-api/org/springframework/orm/hibernate4/LocalSessionFactoryBuilder.html

    FactoryBeans는 FactoryBeans, getObject () 메소드 등을 다루는 어색한 필요성을 해결합니다. FactoryBeans는 XML에서 사용하기에 탁월하지만 @Bean 메소드에서는 적합하지 않습니다.

    이 새로운 빌더는 Hibernate 4.1 이상에서만 사용된다는 점에 유의하십시오.

  2. ==============================

    2.대신 공장 반환 :

    대신 공장 반환 :

    @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으로 주석을 달지 않습니다. 이것은 매우 중요합니다.

  3. ==============================

    3.Tomasz는 맞습니다.하지만 "new"를 사용하여 객체 인스턴스를 만드는 것이 Spring 개념과 맞지 않는다고 생각합니다.

    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();
    
  4. ==============================

    4.위의 답변이 시대에 뒤떨어져 있기 때문에 다음은 현대적인 접근 방식입니다.

    위의 답변이 시대에 뒤떨어져 있기 때문에 다음은 현대적인 접근 방식입니다.

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

    또한 EntityManager를 삽입했다면 다음을 통해 현재 세션을 가져올 수 있습니다 :

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

    5.모든 속성을 설정 한 후 세션 팩토리에서 afterPropertiesSet ()을 호출해야합니다.

    모든 속성을 설정 한 후 세션 팩토리에서 afterPropertiesSet ()을 호출해야합니다.

    따라서 귀하의 예에서는 다음과 같이 보일 것입니다 :

    @Bean
    public SessionFactory sessionFactory(){
        AnnotationSessionFactoryBean sessionFactoryBean = new AnnotationSessionFactoryBean();
        sessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml"));
        sessionFactoryBean.afterPropertiesSet();
        return sessionFactoryBean.getObject();
    }
    
  6. from https://stackoverflow.com/questions/8121461/spring-hibernate-sessionfactory by cc-by-sa and MIT license