[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.내 자신이이에 둘러보고 많이했고, 나는 (내가 도움 (비 인라인을 포함) 하단에 링크) 작업있어 무엇을 공유하고자합니다.
내 자신이이에 둘러보고 많이했고, 나는 (내가 도움 (비 인라인을 포함) 하단에 링크) 작업있어 무엇을 공유하고자합니다.
인터셉터를 사용하려면 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.여보세요,
여보세요,
우선 당신은을 확인할 수 있습니다 https://www.baeldung.com/database-auditing-jpa 모든 옵션이 상세하게 설명된다.
나는 개인적으로 쉽게 절전 모드 인터셉터가 사용하고 이해하는 것이 좋습니다. 프로젝트의 복잡도에 따라, 대부분의 경우에 할 것입니다.
spring.jpa.properties.hibernate.ejb.interceptor = path.to.interceptor을 (application.properties에) : 응용 프로그램에서이를 구성하기 위해 당신은 단순히 추가해야합니다. 인터셉터 자체가 @Component해야한다.
만큼 인터셉터는 실제로 콩을 사용하지 않는. 그렇지 않으면 조금 더 복잡하지만 난 솔루션을 제공하기 위해보다 더 행복 할 것이다.
(또는 당신이 그것을 사용하기 원하는) (매우 도움이되지 않을 것이다) 테스트에서 로깅 시스템을 사용하지 않는, application-test.properties에 EmptyInterceptor를 추가하는 것을 잊지 마십시오.
이 당신에게 사용이었다 바랍니다.
최종 참고로 : 항상 (가능한 최신을 사용하는) 당신의 봄 / 최대 절전 모드 버전을 업데이트하고 최신 버전은 가능한 한 구성을 줄이기 위해 시도 대부분의 코드가 중복 될 것이라고 볼 수 있습니다.
from https://stackoverflow.com/questions/39663669/hibernate-interceptor-or-listener-with-spring-boot-and-spring-data-jpa by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 봄 SAML - 읽기 및 실행시 상쾌한 IdP가 메타 데이터 (0) | 2019.10.03 |
---|---|
[SPRING] 어떻게 봄 부팅 응용 프로그램에서 활성 구성을 기록하는? (0) | 2019.10.03 |
[SPRING] 무엇 여러 필드에 대한 findBy를 사용하는 스프링 데이터 JPA 방법이며, 또한 모든 필드에 포함하는 절을 사용 (0) | 2019.10.03 |
[SPRING] 봄을 통해 편안하고 인증 (0) | 2019.10.03 |
[SPRING] 중첩 된 객체와 @Jsonview 사용하여 직렬화하는 방법 (0) | 2019.10.03 |