2014-09-26 57 views
0

我的代码JPA prepersist回调不叫上父母

@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

+3

都是表中的记录被插入? OTOH如果我坚持一个子类的实例,那么我期望这个子类的'@ PrePersist'方法被调用,但不是超类'。毕竟这个子类是一个完整的实体,它将被保存到两个表中,但仍然是一个对象。 – dic19 2014-09-26 13:43:35

+0

我在我的父类中有一个日期字段,我想设置当前时间在数据库中创建一个新记录 – kraken 2014-09-26 16:08:22

+0

如果您使用连接的继承来代替它是否工作? – Chris 2014-09-29 14:17:51

回答

5

书掌握Java持久性API注意到以下几点:

在回退回调方法

回调方法可能出现在任何实体或映射超类上,无论是抽象还是具体的 。规则相当简单。 对于给定的事件类型,每个 回调方法将根据其在层次结构中的位置以大多数通用类别的先后顺序以 的顺序调用。 因此,如果我们的员工层次,我们在图10-10看到 Employee类包含一个名为 检查名()一PrePersist回调方法,并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 
    } 
} 
+0

这不是我需要的。我在父类中只需要一个回调,但它不起作用(即使我从子类中删除回调)。 – kraken 2014-09-26 16:06:33

+0

第一个不是我期望的工作。方法onCreateOne()尚未执行。我只看到“执行onCreate2” – kraken 2014-09-28 08:46:16

+0

我做了测试项目,显示PreCreate不起作用。 https://github.com/SunPj/eclipselink-h2-jpa/tree/master – kraken 2014-09-28 10:15:25