hibernate JPA EventListeners不工作

mnemlml8  于 2023-10-23  发布在  其他
关注(0)|答案(2)|浏览(117)

我使用Sping Boot ,运行v1.5.1.RELEASE,Spring v4.3.6.RELEASE。我试图对我的JPA事件侦听器做一些巧妙的处理,但它不起作用;
我的实体看起来像这样

@Entity
@EntityListeners({MyEntityListener.class})
public class Entity extends SomeOtherEntity implements SomeInterfaceForAudit {
}

我的EventView类看起来像这样

public class MyEntityListener extends EntityListener<SchoolAdmin> {

// some other useful things in here...

}

我的“聪明”在于,我曾试图像这样“概括”不确定性;
public abstract class footer {

public abstract class EntityListener<T> {

        private Logger logger = LoggerFactory.getLogger(this.getClass());

        @PostUpdate
        @PostConstruct
        @PostRemove
        public void queueForIndex(T entity) {
            logger.info("queueForIndex " + entity.toString());
        }
    }
}

没有记录。我尝试在Entity类中创建这样的方法

@PostUpdate
public void reIndex() {
    System.out.println("--- post update-- ---- -<<<--- " + entity);
}

我不明白为什么我的通用版本不能工作?有人吗?

lpwwtiir

lpwwtiir1#

如果你查看jpa实体生命周期回调注解的官方文档,你会发现那里没有@Inherited注解。这个元注解导致注解从超类继承。由于它不在这些回调方法注解中,子类将不知道它们在超类中的存在。在你的例子中,MyMyScriptyListener.class通过继承作为一个普通的方法,而不是作为一个实体生命周期的回调方法,来获取MyScriptyForIndex(T实体)方法。
仅显示一个作为示例参考:http://docs.oracle.com/javaee/6/api/javax/persistence/PostUpdate.html

@Target(value=METHOD)
@Retention(value=RUNTIME)
public @interface PostUpdate
6ovsh4lw

6ovsh4lw2#

正确的答案是,当Hibernate从侦听器类获取方法时,它使用getDeclaredMethods(),它不返回继承的方法。
你可以在org.hibernate.jpa.event.internal.CallbackDefinitionResolverLegacyImpl.resolveEntityCallbacks中看到

XClass xListener = reflectionManager.toXClass( listener );
callbacksMethodNames = new ArrayList<>();
List<XMethod> methods = xListener.getDeclaredMethods();

来自hibernate-core-5.6.15的代码

相关问题