1

我找到

允许一个类覆盖相同回调类型的继承回调方法,在这种情况下,不会调用被覆盖的方法。

@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 进行了测试

4

1 回答 1

4

Java 类不会自动继承注解。在这种情况下,JPA 规范声明@PrePersist注释可以由子级继承 - 这是由 JPA 提供者(而不是虚拟机)处理的实现细节。因此,在您的情况下,您实际上可以删除@PrePersist子类中的注释:

@Entity
class Child {
    @Override
    protected void _PrePersist() {
        super._PrePersist(); 
    }
}

现在,无论 JPA 提供者是否允许@PrePersist 注释的继承,所有 Java 语言规则都完全适用。在这种情况下,您不能在子类中覆盖超类的私有方法——这在 Java 规范中是不允许的,因此当然也不适用于 JPA。

实际上,这里有两套规则在起作用,JPA 规则和 Java 规范规则,并且您的代码必须同时遵守这两个规则。

于 2013-03-06T01:54:02.800 回答