我使用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不应该工作?任何人吗?
答案 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