我使用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);
}
我不明白为什么我的通用版本不能工作?有人吗?
2条答案
按热度按时间lpwwtiir1#
如果你查看jpa实体生命周期回调注解的官方文档,你会发现那里没有
@Inherited
注解。这个元注解导致注解从超类继承。由于它不在这些回调方法注解中,子类将不知道它们在超类中的存在。在你的例子中,MyMyScriptyListener.class通过继承作为一个普通的方法,而不是作为一个实体生命周期的回调方法,来获取MyScriptyForIndex(T实体)方法。仅显示一个作为示例参考:http://docs.oracle.com/javaee/6/api/javax/persistence/PostUpdate.html
6ovsh4lw2#
正确的答案是,当Hibernate从侦听器类获取方法时,它使用
getDeclaredMethods()
,它不返回继承的方法。你可以在
org.hibernate.jpa.event.internal.CallbackDefinitionResolverLegacyImpl.resolveEntityCallbacks
中看到来自hibernate-core-5.6.15的代码