JPA EventListeners无法正常工作

时间:2017-02-16 21:29:12

标签: java spring hibernate jpa

我使用Spring Boot,运行v1.5.1.RELEASE,Spring v4.3.6.RELEASE。我试图对我的JPA事件监听器有点聪明,但它不起作用;

我的实体看起来像这样

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

我的EventListener类看起来像这个

public class MyEntityListener extends EntityListener<SchoolAdmin> {

// some other useful things in here...

}

我的“聪明”在于我试图像这样“生成”EntityListener;

公共抽象类EntityListener {

   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);
} 

这很有效。我不明白为什么我的Generified versjon不应该工作?任何人吗?

1 个答案:

答案 0 :(得分:1)

如果查看官方文档,对于jpa实体生命周期回调注释,您将看到那里没有@Inherited注释。此元注释会导致注释从超类继承。由于它不在这些回调方法注释中,因此子类将不会意识到它们在超类中的存在。正是在你的情况下,MyEntityListener.class通过继承作为普通方法获取queueForIndex(T实体)方法,而不是实体生命周期回调方法。

仅显示一个作为示例参考: http://docs.oracle.com/javaee/6/api/javax/persistence/PostUpdate.html

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