Jpa prepersist回调未调用父母

时间:2014-09-26 13:36:26

标签: java jpa eclipselink

我的代码

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class SiteMessage implements Identifiable{
    @PrePersist
    public void onCreate1(){
        System.out.println("Executed onCreate1");
    }
}

@Entity
@Table(name = "feedback")
public class Feedback extends SiteMessage {
    @PrePersist
    public void onCreate2(){
        System.out.println("Executed onCreate2");
    }
}

当我保存反馈实体时,我希望我会看到:执行onCreate1并执行onCreate2,但我只看到执行onCreate2

我使用eclipselink v2.5.2

2 个答案:

答案 0 :(得分:8)

掌握Java持久性API的书中注意到以下内容:

  

继承回调方法

     

回调方法可能出现在任何实体或映射的超类上,无论如何   抽象或具体。规则相当简单。 就是这一切   将按顺序调用给定事件类型的回调方法   根据它在层次结构中的位置,最常见的是第一类。   因此,如果在我们的Employee层次结构中,我们在图10-10中看到了   Employee类包含一个名为的PrePersist回调方法   checkName()和FullTimeEmployee还包含PrePersist回调   名为verifyPension()的方法,当PrePersist事件发生时,   checkName()方法将被调用,然后是verifyPension()   方法

因此,如果原始代码中的其他所有内容都是正确的,那么您应该看到onCreateOne()和onCreateTwo()都按此顺序调用。

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class SiteMessage implements Identifiable{
    @PrePersist
    public void onCreateOne(){
        System.out.println("Executed onCreate1"); //executes first
    }
}

@Entity
@Table(name = "feedback")
public class Feedback extends SiteMessage {
    @PrePersist
    public void onCreateTwo(){
        System.out.println("Executed onCreate2"); //executes second
    }
}

接下来请注意以下内容,以便您能够完全按照要求进行设置。

  

我们也可以在CompanyEmployee映射的超类上有一个方法   我们想要应用于子类化的所有实体。要是我们   添加一个名为checkVacation()的PrePersist方法来验证该方法   假期遗留量小于一定数量,将被执行   在checkName()之后和verifyPension()之前。它变得更有趣   如果我们在PartTimeEmployee类上定义一个checkVacation()方法   因为兼职员工没有那么多假期。 注释   用PrePersist重写的方法会导致   调用PartTimeEmployee.checkVacation()方法而不是   CompanyEmployee中的一个

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class SiteMessage implements Identifiable{
    @PrePersist
    public void onCreate(){
        System.out.println("Executed onCreate1"); //will not execute
    }
}

@Entity
@Table(name = "feedback")
public class Feedback extends SiteMessage {
    @PrePersist
    public void onCreate(){
        System.out.println("Executed onCreate2"); //will execute
    }
}

答案 1 :(得分:0)

您可以在基础实体(父)上使用注释“ @MappedSuperClass”。 正如我所显示的:

@MappedSuperclass
public class Base implements Serializable {

    @Id
    private UUID id;

    @PastOrPresent
    private OffsetDateTime createdAt;

    @PastOrPresent
    private OffsetDateTime updatedAt;

    //get/set here

    @PrePersist
    public void prePersist() {
        createdAt = OffsetDateTime.now();
        updatedAt = OffsetDateTime.now();
    }

}

内部类:

@Entity
@HasExtendedValidator
public class Settings extends Base implements Serializable  {
..
}

像魅力一样工作!