[SPRING] Spring Hibernate SessionFactory
SPRINGSpring 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.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.대신 공장 반환 :
대신 공장 반환 :
@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.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.위의 답변이 시대에 뒤떨어져 있기 때문에 다음은 현대적인 접근 방식입니다.
위의 답변이 시대에 뒤떨어져 있기 때문에 다음은 현대적인 접근 방식입니다.
@Bean public SessionFactory sessionFactory(HibernateEntityManagerFactory hemf){ return hemf.getSessionFactory(); }
또한 EntityManager를 삽입했다면 다음을 통해 현재 세션을 가져올 수 있습니다 :
Session session = entityManager.unwrap(Session.class);
-
==============================
5.모든 속성을 설정 한 후 세션 팩토리에서 afterPropertiesSet ()을 호출해야합니다.
모든 속성을 설정 한 후 세션 팩토리에서 afterPropertiesSet ()을 호출해야합니다.
따라서 귀하의 예에서는 다음과 같이 보일 것입니다 :
@Bean public SessionFactory sessionFactory(){ AnnotationSessionFactoryBean sessionFactoryBean = new AnnotationSessionFactoryBean(); sessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml")); sessionFactoryBean.afterPropertiesSet(); return sessionFactoryBean.getObject(); }
from https://stackoverflow.com/questions/8121461/spring-hibernate-sessionfactory by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 분할 된 작업은 완료 후에 자체적으로 멈출 수 없습니까? 봄 배치 (0) | 2019.04.11 |
---|---|
[SPRING] 엔티티를 json으로 최대 절전 모드로 전환 (0) | 2019.04.11 |
[SPRING] 간단한 봄, 독립 실행 형 응용 프로그램에 대한 ClasspathApplicationContext 사용, 재사용 방법 (0) | 2019.04.11 |
[SPRING] URLClassLoader는 Annotation을 com.sun으로로드합니다. $ Proxy $ 27 (0) | 2019.04.11 |
[SPRING] Equinox (OSGi) 및 JPA / Hibernate - 엔티티 찾기 (0) | 2019.04.11 |