복붙노트

[SPRING] 봄 부팅 및 스프링 데이터 JPA와 인터셉터 또는 수신기를 최대 절전 모드

SPRING

봄 부팅 및 스프링 데이터 JPA와 인터셉터 또는 수신기를 최대 절전 모드

나는 객체의 자식 컬렉션을 저장하기 전에 몇 가지 검사 (폭포 = 모든)를 실행하고 싶습니다.

나는 봄 부팅 및 스프링 데이터 JPA를 사용하고 최고의 일 것입니다 무슨 방법 궁금 : 하이버 네이트 리스너 또는 인터셉터를. 각각의 장점 / 단점은 무엇입니까? 당신은 당신이 가장 좋은 방법을 고려 하나 예를 들어이 일이 있습니까?

내가 전에 다음과 같이 XML에 구성된 최대 절전 모드 수신기를 사용하고 있습니다 :

    <property name="eventListeners">
        <map>
            <entry key="post-update">
                <list>
                    <ref bean="myListener" />
                </list>
            </entry>
        </map>
    </property>

세션 공장 (이전 프로젝트)에. 하지만 지금 내 CONFIGS의 대부분은 주석에 (봄 부팅 원인) 나는 어쩌면 인터셉터는 것, 가능한 한 단순하고 가볍게 더 나은 솔루션을 CONFIGS을 유지하려는.

감사합니다.

해결법

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

    1.내 자신이이에 둘러보고 많이했고, 나는 (내가 도움 (비 인라인을 포함) 하단에 링크) 작업있어 무엇을 공유하고자합니다.

    내 자신이이에 둘러보고 많이했고, 나는 (내가 도움 (비 인라인을 포함) 하단에 링크) 작업있어 무엇을 공유하고자합니다.

    인터셉터를 사용하려면 org.hibernate.EmptyInterceptor 클래스를 확장하고 요격 할 방법을 우선합니다. 당신은 아마 당신의 경우에 된 OnSave (...)를 할 수 있습니다.

    package foo.bar;
    
    import org.hibernate.EmptyInterceptor;
    import org.hibernate.type.Type;
    import java.io.Serializable;
    
    public class MyInterceptor extends EmptyInterceptor {
        @Override
        public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) {
            // do your checks here
            return false;
        }
    }
    

    당신은 봄 / 최대 절전 모드와 인터셉터를 등록해야합니다. 당신은 당신의 application.properties 또는 application.yml에서이 작업을 수행 할 수 있습니다.

    spring:
      jpa:
        properties:
          hibernate.ejb.interceptor: foo.bar.MyInterceptor
    

    인터셉터에 그나는 것을 (잠재적) 적은 코드 비교적 간단한 구성이다. 단점은 당신이 단지 전체 응용 프로그램 하나를 가질 수 있고, API가 작동하는 복잡 할 수 있습니다.

    이벤트의 경우, 당신은 Hibernate의 org.hibernate.event.spi 중 하나를 구현합니다. * 리스너 인터페이스를. 당신은 아마 당신의 경우에 org.hibernate.event.spi.PreInsertEventListener를 원한다.

    당신은 EventListenerRegistry에서 이벤트를 등록해야합니다. 이렇게하려면, 당신은 당신의 클래스로의 EntityManagerFactory @Autowire 당신의 클래스 A @Component를 만들고, 당신의 클래스를 등록하는 @PostConstruct 방법을 만들 수 있습니다.

    package foo.bar;
    
    import org.hibernate.event.service.spi.EventListenerRegistry;
    import org.hibernate.event.spi.EventType;
    import org.hibernate.event.spi.PreInsertEvent;
    import org.hibernate.event.spi.PreInsertEventListener;
    import org.hibernate.internal.SessionFactoryImpl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    import javax.annotation.PostConstruct;
    import javax.persistence.EntityManagerFactory;
    
    @Component
    public class MyEventListener implements PreInsertEventListener {
        @Autowired
        private EntityManagerFactory entityManagerFactory;
    
        @PostConstruct
        private void init() {
            SessionFactoryImpl sessionFactory = entityManagerFactory.unwrap(SessionFactoryImpl.class);
            EventListenerRegistry registry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class);
            registry.getEventListenerGroup(EventType.PRE_INSERT).appendListener(this);
        }
    
        @Override
        public boolean onPreInsert(PreInsertEvent preInsertEvent) {
            // do your checks here
            return false;
        }
    }
    

    청취자에 그나 당신이 원하는만큼을 가질 수있는, API는 인터셉터의 것보다 더 좋은, 그리고 코드와 구성은 한 곳에서 모두. 단점은 구성이 더 길고 더 복잡하다는 것이다.

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

    2.여보세요,

    여보세요,

    우선 당신은을 확인할 수 있습니다 https://www.baeldung.com/database-auditing-jpa 모든 옵션이 상세하게 설명된다.

    나는 개인적으로 쉽게 절전 모드 인터셉터가 사용하고 이해하는 것이 좋습니다. 프로젝트의 복잡도에 따라, 대부분의 경우에 할 것입니다.

    spring.jpa.properties.hibernate.ejb.interceptor = path.to.interceptor을 (application.properties에) : 응용 프로그램에서이를 구성하기 위해 당신은 단순히 추가해야합니다. 인터셉터 자체가 @Component해야한다.

    만큼 인터셉터는 실제로 콩을 사용하지 않는. 그렇지 않으면 조금 더 복잡하지만 난 솔루션을 제공하기 위해보다 더 행복 할 것이다.

    (또는 당신이 그것을 사용하기 원하는) (매우 도움이되지 않을 것이다) 테스트에서 로깅 시스템을 사용하지 않는, application-test.properties에 EmptyInterceptor를 추가하는 것을 잊지 마십시오.

    이 당신에게 사용이었다 바랍니다.

    최종 참고로 : 항상 (가능한 최신을 사용하는) 당신의 봄 / 최대 절전 모드 버전을 업데이트하고 최신 버전은 가능한 한 구성을 줄이기 위해 시도 대부분의 코드가 중복 될 것이라고 볼 수 있습니다.

  3. from https://stackoverflow.com/questions/39663669/hibernate-interceptor-or-listener-with-spring-boot-and-spring-data-jpa by cc-by-sa and MIT license