Java Hibernate@PostLoad永远不会被调用

Java Hibernate@PostLoad永远不会被调用,java,hibernate,orm,Java,Hibernate,Orm,查看了许多论坛,但没有找到答案…简单的东西,用@PostLoad注释的方法从未被调用…通过@EntityListeners添加了侦听器,但问题仍然存在。我正在使用基于SessionFactory的配置。EJB3@PostLoad注释不起作用。当使用基于SessionFactory的配置时,将永远不会调用post-load方法 使用Hibernate或基于的EntityManager配置。在使用SessionFactory:implementing接口时,还有一种替代Hibernate的拦截器或事

查看了许多论坛,但没有找到答案…简单的东西,用@PostLoad注释的方法从未被调用…通过@EntityListeners添加了侦听器,但问题仍然存在。我正在使用基于SessionFactory的配置。

EJB3
@PostLoad
注释不起作用。当使用基于SessionFactory的配置时,将永远不会调用post-load方法


使用Hibernate或基于
的EntityManager配置。

在使用SessionFactory:implementing接口时,还有一种替代Hibernate的拦截器或事件方法。

或启用处理JPA回调的Hibernate事件侦听器。这正是哼哼所做的。Hibernate3和Hibernate4的实现方式不同(您从未提到您使用的是哪个版本);查看文档,了解有关(a)所涉及的事件侦听器和(b)如何指定自定义侦听器集的详细信息。

我也一直在努力使用会话工厂在Hibernate4上实现这一点

我发现这个解决方案非常简单,但没有使用Integrator(显然是Hibernate4处理SessionFactory和侦听器的方式)记录在任何地方。 hibernate entitymanager项目提供了一个集成程序来添加所需的侦听器,以链接EJB3的注解@PostLoad。。。到会话工厂。只需以SPI方式声明类JpaIntegrator


具体来说,只需在META-INF/services文件夹中添加一个名为org.hibernate.integrator.spi.integrator的文件,并在其中声明实现类(org.hibernate.ejb.event.JpaIntegrator)

以下是如何在hibernate 5中启用JPA的后期注释

Hibernate的
IntegratorServiceImpl
使用
java.util.ServiceLoader
API,因此我们可以指定希望
SessionFactory
使用的
org.Hibernate.integrator.spi.integrator
实现的附加列表

我们需要做的就是在META-INF/services/org.hibernate.integrator.spi.integrator中指定一个服务提供者:

# This allows us to use JPA-style annotation on entities, such as @PostLoad
our.custom.JpaAnnotationsIntegrator
您还需要确保相应版本的“
hibernate entitymanager
”jar位于类路径上

our.custom.jpa注释集成器
(取自
org.hibernate.jpa.event.spi.jpa集成器
):


使用SessionFactory时,回调完全可以工作。您只需自己启用适当的Hibernate事件侦听器。以下是如何启用事件侦听器:但请注意此错误:它也适用于Lifecycle.onLoad(在初始化集合之前调用-直到在Hibernate 4.1.8中修复为止)也许我很胖,但是我很难在Hibernate4的文档中找到如何做到这一点。很好的解决方案。仅供参考,从Hibernate 4.3.5开始,该文件的内容应该是“org.Hibernate.jpa.event.spi.JpaIntegrator”。这也是我使用的解决方案,尽管我发现它会在Hibernate 5中打破刷新级联。请参阅下面我的答案以获得解决办法。@Matt我知道这是一个非常古老的问题,但我应该在哪里找到此META-INF/Services?我只能在我下载hibernate的文件夹中找到它,在做了更改之后,它仍然不起作用。
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();
        }
    }
 }