具有相同名称的私有回调方法

时间:2013-03-06 01:37:16

标签: java hibernate jpa eclipselink lifecycle

我找到了

  

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

实际上,您在这里有两套规则,JPA规则和Java规范规则,您的代码必须符合