2

我可以在父类和子类中定义相同的 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");
    }
}
4

2 回答 2

6

我已经为上述场景编写了一个单元测试并且它有效。对于子类中的每个回调方法,您必须首先调用父回调方法:

@Override
@PrePersist
protected onPrePersist() {
    **super.onPrePersist();**
    System.out.println("Child onPrePersist() invoked");
}
于 2013-05-18T09:58:54.220 回答
4

您不必自己调用父回调方法,只需不要覆盖带 @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()
于 2016-01-02T14:19:59.007 回答