2014-09-26 49 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