我的代码
@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
答案 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 {
..
}
像魅力一样工作!