복붙노트

[SPRING] Hibernate에 의해로드 된 엔티티로 Spring을 통해 필드 주입

SPRING

Hibernate에 의해로드 된 엔티티로 Spring을 통해 필드 주입

Hibernate에 의해 DB에서로드 된 bean에서 Spring을 통해 특정 속성을 주입하는 방법을 찾고있다.

class Student {
   int id; //loaded from DB
   String name; //loaded from DB
   int injectedProperty; //Inject via Spring
}

Hibernate가 Student 클래스의 객체를 생성 할 때마다 어떤 applicationContext 파일에 정의 된 일부 속성이 객체 생성과 함께 삽입되도록 Spring을 설정할 수 있습니까?

해결법

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

    1.@Configurable 주석으로 AspectJ 클래스를 짜는 기능을 사용하기위한 기능이있다. 이것은 Hibernate와 같은 것을 사용하여 리플렉션을 통해 인스턴스화 된 객체를 포함하여, Spring 의존성을 가진 주석 된 클래스의 새로운 인스턴스를 자동 와이어합니다.

    @Configurable 주석으로 AspectJ 클래스를 짜는 기능을 사용하기위한 기능이있다. 이것은 Hibernate와 같은 것을 사용하여 리플렉션을 통해 인스턴스화 된 객체를 포함하여, Spring 의존성을 가진 주석 된 클래스의 새로운 인스턴스를 자동 와이어합니다.

    일부 클래스 로딩 마법이 필요하므로 서버 플랫폼과의 호환성에 따라 다릅니다.

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

    2.aspectj 방식이 작동하는 동안 표준 스프링 / 최대 절전 모드는 LoadEventListener를 등록하는 것입니다 (자세한 내용은 최대 절전 모드 코어 참조, 스프링 참조 및이 스레드 참조)

    aspectj 방식이 작동하는 동안 표준 스프링 / 최대 절전 모드는 LoadEventListener를 등록하는 것입니다 (자세한 내용은 최대 절전 모드 코어 참조, 스프링 참조 및이 스레드 참조)

    여기 스프링 sessionfactory bean 정의에서 찍은 것이다.

    <bean id="mySessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        ...
        <property name="eventListeners">
            <map>
                <entry key="post-load">
                    <bean class="com.foo.spring.MyLoadListener"></bean>
                </entry>
            </map>
        </property>
    </bean>
    

    여기에 LoadEventListener가 있습니다.

    public class MyLoadListener implements LoadEventListener{
    
        public void setSpringManagedProperty(String springManagedProperty){
            this.springManagedProperty = springManagedProperty;
        }
        private String springManagedProperty;
    
        @Override
        public void onLoad(LoadEvent event, LoadType loadType) throws HibernateException{
            if(MyEntity.class.getName().equals(event.getEntityClassName())){
                MyEntity entity = (MyEntity) event.getInstanceToLoad();
                entity.setMyCustomProperty(springManagedProperty);
            }
    
        }
    
    }
    

    엄마 봐, aspectj는 필요 없어.

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

    3.한 가지 방법은 맞춤형 사용자 유형을 정의하고 거기에있는 스프링 구성에서 속성에 액세스하는 것입니다. 그러나 나는 당신이 다른 사람들로부터 훨씬 더 좋은 답을 얻을 것이라고 생각합니다. :)

    한 가지 방법은 맞춤형 사용자 유형을 정의하고 거기에있는 스프링 구성에서 속성에 액세스하는 것입니다. 그러나 나는 당신이 다른 사람들로부터 훨씬 더 좋은 답을 얻을 것이라고 생각합니다. :)

  4. ==============================

    4.엔터티에 대한 최대 절전 모드 DAO 빈에 종속성을 삽입하고 엔터티에 대한 속성을 DAO에서 반환하기 전에 설정할 수 있습니다.

    엔터티에 대한 최대 절전 모드 DAO 빈에 종속성을 삽입하고 엔터티에 대한 속성을 DAO에서 반환하기 전에 설정할 수 있습니다.

    DAO에서 엔터티를로드하는 경우에만 작동합니다.

  5. from https://stackoverflow.com/questions/3505421/injecting-fields-via-spring-into-entities-loaded-by-hibernate by cc-by-sa and MIT license