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 仕様ルールという 2 つのルール セットが使用されており、コードは両方に準拠する必要があります。

于 2013-03-06T01:54:02.800 に答える