@MappedSuperclass和子类中的相同JPA回调方法

时间:2013-05-18 08:08:49

标签: jpa

我可以在父类和子类中定义相同的JPA回调方法,如下所示?如果是,我是否需要调用super.onPrePersist();在子类onPrePersist()方法?

@MappedSuperclass
public abstract class AbstractEntity {

    @PrePersist
    protected onPrePersist() {
        System.out.println("Parent onPrePersist() invoked");
    }
}

@Entity
@Table(name = "child")
public class Child extends AbstractEntity {

    @PrePersist
    protected onPrePersist() {
        **super.onPrePersist();**
        System.out.println("Child onPrePersist() invoked");
    }
}

2 个答案:

答案 0 :(得分:4)

我已经为上面的场景编写了一个单元测试,它可以工作。对于子类中的每个回调方法,您必须首先调用父回调方法:

@Override
@PrePersist
protected onPrePersist() {
    **super.onPrePersist();**
    System.out.println("Child onPrePersist() invoked");
}

答案 1 :(得分:2)

您不必自己调用父回调方法,只是不要覆盖 @PrePersist 带注释的方法,因为它隐藏父方法并阻止它被执行。如果您的回调方法具有不同的名称,则将根据它们在层次结构中的位置按顺序调用它们,首先是大多数通用类。

@MappedSuperclass
public abstract class AbstractEntity {

    @PrePersist
    protected onPrePersistParent() {
        System.out.println("Parent onPrePersist() invoked");
    }
}

@Entity
@Table(name = "child")
public class Child extends AbstractEntity {

    @PrePersist
    protected onPrePersistChild() {
        System.out.println("Child onPrePersist() invoked");
    }
}

这将产生输出:

  1. 调用了父onPrePersist()
  2. 调用了儿童onPrePersist()