2011-02-24 21 views
1

我有幾個實體類。現在我想在每個實體中使用@PostLoad。功能代碼適用於每個實體。所以我創建了一個包含@PostLoad方法的超類(公共抽象類AbstractModel {..})。現在可以做到這一點嗎?在一個快速測試中,該方法沒有執行,但該方法被執行放置在實體中...也許有人對此有一個解決方法?@PostLoad超類

@Entity 
@Table(name = "albums") //de naam van de tabel wordt 'albums' 
public class Album extends Parent implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") //de naam van de kolom wordt 'id' 
    private Long id; 

... 
} 

,當我運行它的錯誤:

@MappedSuperclass 
public class Parent implements Serializable 
{ 

    @PostLoad 
    public void postLoad() 
    { 
     System.out.println("postLoad called!"); 
    } 


} 

我的實體類,誰從父延伸

例外[EclipseLink的-30005(Eclipse的 持久性服務 - 2.0.2.v20100323-r6872):org.eclipse.persistence.exceptions.PersistenceUnitLoadingException 異常說明:異常 - 異常[EclipseLink的-28018(Eclipse的 持久性服務: [email protected]

內部異常: javax.persistence.PersistenceException 210,在用類加載器搜索 持續拋出檔案2.0.2.v20100323-r6872):org.eclipse.persistence.exceptions.EntityManagerSetupException

異常描述:PersistenceUnit [JPA_TestPU] 的預部署 失敗。

內部異常:異常 [的EclipseLink-7161](蝕 持久性服務 - 2.0.2.v20100323-r6872):org.eclipse.persistence.exceptions.ValidationException 異常描述:實體類 [類jpatest。相冊]沒有指定主要的 密鑰。它應該定義 @Id,@EmbeddedId或@IdClass。如果 您已經使用這些 註釋中的任何一個定義了PK,那麼確保 012xx在實體類層次結構中沒有混合訪問類型( 字段和屬性都註釋了)。

+0

只是要在安全方面,你有註解的父類的抽象@實體還是@MappedSuperclass? – Erik 2011-02-24 20:19:30

+0

如果你發佈你的代碼,這將更容易 – Erik 2011-02-24 20:26:35

+0

現在我把它標記爲@MappedSuperclass,但現在它抱怨他們沒有在子類中的主鍵(子類是實體,超類是映射超類)。在子類中,它們是主鍵。 – 2011-02-24 20:40:09

回答

0

至少「JPA的Java持久性」說這應該適用於映射的超類(用@MappedSuperClass標記AbstractModel)。

+0

中所述,但在超類中,我需要定義一個@Id,我不想做...因爲在子類(實體)我已經定義了鍵。但是我會在每個實體中複製/粘貼@PostLoad。 – 2011-02-25 14:17:33

+0

這很奇怪,我們使用@MappedSuperClasses而沒有@Id's(擴展類自然具有@Id's),並且我們從未遇到過這個問題(儘管我們使用Hibernate作爲JPA實現,但我沒有EclipseLink的使用經驗)。作爲@GeneratedValue-strategies,我們使用GenerationType.IDENTITY(數據庫中的id是PostgreSQL串行類型),但我認爲這沒有什麼不同。 – esaj 2011-02-25 16:05:49

0

您的AbstractModel與@MappedSuperclass映射了嗎?

+0

它抱怨實體類中的PK ... – 2011-02-24 20:23:30

+0

請向我們展示一些代碼片段,如Erik – onigunn 2011-02-24 20:39:19

1

您無意中切換訪問類型,EclipseLink忽略字段註釋。因爲它是@PostLoad導致這個我建議提交一個錯誤。 如果你正在使用JPA 2.0你可以直接指定專輯中的訪問類型,或者使用JPA 1.0只是標註爲訪問屬性:

@Entity 
@Table(name = "albums") //de naam van de tabel wordt 'albums' 
public class Album extends Parent implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    private Long id; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") //de naam van de kolom wordt 'id' 
    public Long getId(){ 
     ... 
    } 

    public Long setId(Long id){ 
     ... 
    } 
}