2013-05-18 105 views
0

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

@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"); 
    } 
} 
+1

当你测试它,会发生什么? JPA实体是Java对象,并遵守相同的规则。如果你重写一个方法,重写的方法将被调用。 –

回答

2

我已经为上述场景编写了一个单元测试,它工作。对于每一个在子类中的回调方法,你必须调用父回调方法第一:

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

+1用于测试和试验,而不是询问。 –

0

您不必自行调用父回调方法,只是不覆盖@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()调用
相关问题