복붙노트

[SPRING] Spring 3 주석 - HibernateDaoSupport - 저장소가 세션 팩토리를 필요로 함

SPRING

Spring 3 주석 - HibernateDaoSupport - 저장소가 세션 팩토리를 필요로 함

나는 예외를 말하고있다 :

HibernateDaoSupport 클래스에서 @Repository 주석을 사용하려고 할 때. 이 오류 메시지는 저장소를 생성하기 위해 sessionFactory가 필요한 간단합니다. 그러나 XML에 세션 팩토리를 정의했습니다.

<!-- Hibernate -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dashDataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.mycomp.myapp.Category</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            </props>
        </property>
    </bean>

따라서 저장소에 주석을 작성하는 동안 필요한 저장소 인 SessionFactory를 제공하는 방법을 잘 모르겠습니다. 다음을 시도했습니다.

 @Autowired
    protected HibernateTemplate createHibernateTemplate(SessionFactory sessionFactory) {
        return super.createHibernateTemplate(sessionFactory);
    }

하지만 이것은 문제를 해결하지 못합니다. 왜냐하면 저장소가 작업을 수행 할 때뿐만 아니라 인스턴스화하는 동안 해당 속성을 필요로하기 때문일 수 있습니다. 불행히도, @Autowired 어노테이션으로 오버라이드 할 생성자 나 초기화 메소드가 없기 때문에이 문제를 해결하는 방법을 모른다.

sessionFactory 빈이 생성되고 Autowire가 될 수 있는지 확인했는데 괜찮습니다.

해결법

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

    1.HibernateDaoSupport는 setSessionFactory ()를 통해 SessionFactory와 함께 제공된다. 그러나 setSessionFactory ()는 final이므로 @Autowired 주석을 추가하기 위해 재정의 할 수 없습니다. 그러나 임의의 메소드에 @Autowired를 적용하고 setSessionFactory ()를 호출 할 수 있습니다.

    HibernateDaoSupport는 setSessionFactory ()를 통해 SessionFactory와 함께 제공된다. 그러나 setSessionFactory ()는 final이므로 @Autowired 주석을 추가하기 위해 재정의 할 수 없습니다. 그러나 임의의 메소드에 @Autowired를 적용하고 setSessionFactory ()를 호출 할 수 있습니다.

    @Autowired
    public void init(SessionFactory factory) {
        setSessionFactory(factory);
    }
    
  2. ==============================

    2.@Qualifier 주석을 사용하여 사용할 세션 팩토리를 정의 할 수도 있습니다 (예를 들어, 둘 이상인 경우).

    @Qualifier 주석을 사용하여 사용할 세션 팩토리를 정의 할 수도 있습니다 (예를 들어, 둘 이상인 경우).

    @Autowired
    public MyClassImpl(@Qualifier("myOtherSessionFactory") SessionFactory sessionFactory) {
        setSessionFactory(sessionFactory);
    }
    

    AbstractRoutingDataSource를 확장하여 데이터 소스간에 전환 할 수도 있습니다. 이 페이지를 참조하십시오.

  3. from https://stackoverflow.com/questions/3230608/spring-3-annotations-hibernatedaosupport-repository-requires-session-factory by cc-by-sa and MIT license