我找到了
允许类覆盖同一回调类型的继承回调方法,在这种情况下,不会调用重写的方法。
@MappedSuperclass
class Parent {
@PrePersist
protected void _PrePersist() { // <--+
} // |
} // |
// |
@Entity // |
class Child { // |
@PrePersist // |
@Override // |
protected void _PrePersist() { // |
super._PrePersist(); // ---------+
}
}
问题:私人范围怎么样?
回调方法可以具有公共,私有,受保护或包级别访问权限,但不能是 静态或最终的。
@MappedSuperclass
class Parent {
@PrePersist
private void _PrePersist() {
// not invoked.
// is this method still, technically, 'overridden'?
}
}
@Entity
class Child {
@PrePersist
private void _PrePersist() {
// no way to invoke super._PrePersist().
// is this method still, technically, 'overriding' the parent's?
}
}
在这种情况下,Parent#_PrePersist()
未被调用。这是正常的吗?
我使用EclipseLink和Hibernate进行了测试
答案 0 :(得分:4)
Java类不会自动继承注释。在这种情况下,JPA规范声明@PrePersist
注释可以继承子项 - 这是由JPA提供程序(而不是虚拟机)处理的实现细节。因此,在您的情况下,您实际上可以删除子类中的@PrePersist
注释:
@Entity
class Child {
@Override
protected void _PrePersist() {
super._PrePersist();
}
}
现在,无论JPA提供程序是否允许继承@PrePersist
注释,所有Java语言规则 都完全适用 。在这种情况下,您不能覆盖子类中超类的私有方法 - 这是Java规范所不允许的,因此,当然也不适用于JPA。
实际上,您在这里有两套规则,JPA规则和Java规范规则,您的代码必须符合。