많은 포럼을 보았지만 대답을 찾지 못했다. @PostLoad로 주석 된 메소드는 결코 호출되지 않는다. @EntityListeners를 통해 리스너가 추가되었지만 문제가 남아있다. SessionFactory 기반 구성을 사용하고 있습니다.Hibernate @PostLoad는 결코 호출되지 않는다.
답변
SessionFactory
기반 구성을 사용할 때 EJB3 @PostLoad
주석이 작동하지 않으면 사후로드 방법이 호출되지 않습니다.
최대 절전 모드의 Interceptors or events 또는 EntityManager
기반 구성을 사용하십시오.
JPA 콜백을 처리하는 Hibernate 이벤트 리스너를 활성화합니다. 바로 HEM이하는 일입니다. 이것이 어떻게되는지 Hibernate 3와 Hibernate 4는 다르다. (a) 관련 이벤트 리스너 및 (b) 사용자 정의 리스너 세트 지정 방법에 대한 문서를 확인하십시오.
어쩌면 나는 두껍습니다. 그러나 어떻게해야 할 지 찾아내는 데 어려움을 겪고 있습니다. Hibernate 4에 대한 문서에서 이것을하십시오. – David
세션 팩토리를 사용하여 Hibernate4에서이 작업을하기 위해 애써 왔습니다.
솔루션은 매우 단순하지만 Integrator (어디 까지나 SessionFactory 및 리스너를 다루는 Hibernate4의 방법)를 사용하여 어디에도 문서화되지 않았습니다. hibernate-entitymanager 프로젝트는 EJB3의 어노테이션 @PostLoad, ...을 세션 팩토리에 링크하기 위해 필요한 리스너를 추가하기 위해 Integrator를 제공한다. 클래스 을 JpaIntegratorSPI 길로 선언하십시오.
구체적으로는, 단지 META-INF/서비스 폴더에 org.hibernate.integrator.spi.Integrator라는 이름의 파일을 추가하고 (그 안에 org.hibernate.ejb.event.JpaIntegrator을 구현 클래스를 선언)
좋은 해결책입니다. 참고로, Hibernate 4.3.5에서, 파일의 내용은 "org.hibernate.jpa.event.spi.JpaIntegrator"이어야한다. –
이것은 Hibernate 5에서 flush cascades를 깨뜨리는 것으로 나타 났지만, 나는 함께 갔다. 해결 방법은 아래 나의 대답을 보라. –
@Matt 나는 아주 오래된 질문을 알고 있지만이 META-INF/Services는 어디에서 찾아야합니까? 나는 절전 모드를 다운로드하고 변경 한 후에 만 폴더에서 찾을 수 있습니다. 여전히 작동하지 않습니다. –
여기에 5
Hibernate의 IntegratorServiceImpl
가 java.util.ServiceLoader
API를 사용하여 최대 절전 모드에서 JPA의 포스트 연산 주석을 수 있도록, 그래서 우리는 우리가을 원하는 org.hibernate.integrator.spi.Integrator
구현의 추가 목록을 지정할 수있는 방법3210을 사용하십시오.
# This allows us to use JPA-style annotation on entities, such as @PostLoad
our.custom.JpaAnnotationsIntegrator
또한 적절한 버전의 'hibernate-entitymanager
'항아리 클래스 경로에 있는지 확인해야합니다
우리가해야 할 일은 META-INF/services/org.hibernate.integrator.spi.Integrator
에서 서비스 공급자를 지정합니다. (org.hibernate.jpa.event.spi.JpaIntegrator
에서 촬영)
our.custom.JpaAnnotationsIntegrator
는 : SessionFactory를 사용하는 경우
package our.custom;
import org.hibernate.annotations.common.reflection.ReflectionManager;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.internal.MetadataImpl;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.event.service.spi.EventListenerRegistry;
import org.hibernate.event.spi.EventType;
import org.hibernate.integrator.spi.Integrator;
import org.hibernate.jpa.event.internal.core.JpaPostDeleteEventListener;
import org.hibernate.jpa.event.internal.core.JpaPostInsertEventListener;
import org.hibernate.jpa.event.internal.core.JpaPostLoadEventListener;
import org.hibernate.jpa.event.internal.core.JpaPostUpdateEventListener;
import org.hibernate.jpa.event.internal.jpa.CallbackBuilderLegacyImpl;
import org.hibernate.jpa.event.internal.jpa.CallbackRegistryImpl;
import org.hibernate.jpa.event.spi.jpa.CallbackBuilder;
import org.hibernate.jpa.event.spi.jpa.ListenerFactory;
import org.hibernate.jpa.event.spi.jpa.ListenerFactoryBuilder;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.service.spi.SessionFactoryServiceRegistry;
/**
* This integrator allows us to use JPA-style post op annotations on Hibernate entities.
*
* This integrator is loaded by <code>org.hibernate.integrator.internal.IntegratorServiceImpl</code> from
* <code>META-INF/services/org.hibernate.integrator.spi.Integrator</code> file.
*
* <b>Note</b>: This code is lifted directly from <code>org.hibernate.jpa.event.spi.JpaIntegrator</code>
*
* @author Val Blant
*/
public class JpaAnnotationsIntegrator implements Integrator {
private ListenerFactory jpaListenerFactory;
private CallbackBuilder callbackBuilder;
private CallbackRegistryImpl callbackRegistry;
@Override
public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
final EventListenerRegistry eventListenerRegistry = serviceRegistry.getService(EventListenerRegistry.class);
this.callbackRegistry = new CallbackRegistryImpl();
// post op listeners
eventListenerRegistry.prependListeners(EventType.POST_DELETE, new JpaPostDeleteEventListener(callbackRegistry));
eventListenerRegistry.prependListeners(EventType.POST_INSERT, new JpaPostInsertEventListener(callbackRegistry));
eventListenerRegistry.prependListeners(EventType.POST_LOAD, new JpaPostLoadEventListener(callbackRegistry));
eventListenerRegistry.prependListeners(EventType.POST_UPDATE, new JpaPostUpdateEventListener(callbackRegistry));
// handle JPA "entity listener classes"...
final ReflectionManager reflectionManager = ((MetadataImpl) metadata)
.getMetadataBuildingOptions()
.getReflectionManager();
this.jpaListenerFactory = ListenerFactoryBuilder.buildListenerFactory(sessionFactory.getSessionFactoryOptions());
this.callbackBuilder = new CallbackBuilderLegacyImpl(jpaListenerFactory, reflectionManager);
for (PersistentClass persistentClass : metadata.getEntityBindings()) {
if (persistentClass.getClassName() == null) {
// we can have non java class persisted by hibernate
continue;
}
callbackBuilder.buildCallbacksForEntity(persistentClass.getClassName(), callbackRegistry);
}
}
@Override
public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
if (callbackRegistry != null) {
callbackRegistry.release();
}
if (callbackBuilder != null) {
callbackBuilder.release();
}
if (jpaListenerFactory != null) {
jpaListenerFactory.release();
}
}
}
- 1. android onLocationChanged는 결코 호출되지 않았습니다.
- 2. Lua metamethods가 호출되지 않는다.
- 3. WPF : 연결된 동작이 등록되었지만 결코 호출되지 않았습니다?
- 4. Hibernate flush가 데이터베이스를 갱신하지 않는다.
- 5. ASP.NET MVC 사용자 지정보기 엔진이 호출되지 않는다
- 6. UIImageView의 서브 클래스에서 drawRect가 호출되지 않는다.
- 7. Hibernate Envers - 감사 테이블이 Spring-Hibernate-envers 어플리케이션에 삽입되지 않는다.
- 8. 도저 : Hibernate PersistentMap은 java.util.HashMap에 매핑되지 않는다.
- 9. Hibernate EntityManager + JOTM : 트랜잭션이 사용되지 않는다.
- 10. Hibernate : MySQL은 backticks를 사용하지만 HSQL은 사용하지 않는다.
- 11. Hibernate hbm2ddl.auto update는 mysql이있는 컬럼을 삭제하지 않는다.
- 12. JPA/Hibernate remove 엔티티가 작동하지 않는다.
- 13. Hibernate ScrollableResults는 전체 결과 집합을 반환하지 않는다.
- 14. Hibernate HQL 쿼리가 Lucene 인덱스를 업데이트하지 않는다.
- 15. @OneToMany는 Hibernate + JPA에 외래 키를 삽입하지 않는다.
- 16. onActivityResult는 결코
- 17. Spring JMS 네임 스페이스를 사용할 때 메소드가 호출되지 않는다.
- 18. rvct로 컴파일 할 때 전역 정적 멤버의 생성자가 호출되지 않는다
- 19. Hibernate many-to-many 매핑이 올바르게 삽입되지 않는다.
- 20. 추상 클래스에서 선언 된 Hibernate 맵은 서브 클래스에서 상속받지 않는다.
- 21. Hibernate Second-Level Query Cache가 작동하지 않는다. Eager Fetchching
- 22. Spring-Hibernate-envers 웹 애플리케이션의 감사 테이블에 데이터가 삽입되지 않는다.
- 23. Hibernate JPA Discriminator 컬럼이 생성 된 질의에 추가되지 않는다.
- 24. 슈퍼 클래스 메소드에 대해 Hibernate 프록시 객체가 작동하지 않는다.
- 25. 정적 인스턴스, desctructor 결코 호출하지
- 26. NHibernate가 프로퍼티를 캐시하지 않는다.
- 27. NSMutableUrlRequest의 didReceiveData가 결코 트리거되지 않았습니다
- 28. IE는 결코 이미지로드를 멈추지 않습니다.
- 29. 루비 TCPSocket의 recv를 차단 결코
- 30. observeValueForKeyPath가 호출되지
콜백 절대적으로 작업 할 수 있습니다. 적절한 Hibernate 이벤트 리스너를 사용 가능하게 설정하기 만하면된다. –
다음은 이벤트 리스너를 활성화하는 방법입니다. https://n1njahacks.wordpress.com/2016/10/07/jpa-callbacks-with-hibernates-sessionfactory-and-nityentagerager/ –