2013-01-17 63 views
5

我有一個抽象類,它提供了一些要繼承的EJB實體的一些常用功能。其中之一是時間戳列。具有抽象類繼承的JPA實體

public abstract class AbstractEntity { 

    ... 
    private long lastModified; 
    ... 

    @Column 
    public long getLastModified() { 
     return lastModified; 
    } 

    public void setLastModified(long ts) { 
     lastModified = ts; 
    } 
} 

@Table 
@Entity 
public class MyEntity extends AbstractEntity { 
    ... 
    private Long key; 
    private String value; 
    ... 

    @Id 
    public Long getKey() { 
     return key; 
    } 

    public void setKey(Long k) { 
     key = k; 
    } 

    @Column 
    public String getValue() { 
     return value; 
    } 

    public void setValue(String txt) { 
     value = txt; 
     setLastModified(System.currentTimeMillis()); 
    } 
} 

的問題是,時間戳列沒有被添加到數據庫表。是否有一些註釋需要添加到AbstractEntity中才能將lastModified字段作爲列繼承?

我試圖在AbstractEntity中添加@Entity,但在部署時導致異常。

org.hibernate.AnnotationException: No identifier specified for entity: 
AbstractEntity 

回答

13

這裏有幾種可能性。

您沒有爲您的超類定義映射。如果它被認爲是一個可查詢的類型,你應該@Entity註釋它,你還需要一個@Id屬性(這缺少@Id屬性是用於將@Entity註解之後,你所得到的是錯誤的原因)

如果您不需要抽象超類是一個可查詢的實體,但想要它的屬性作爲其子類的表中的列,則需要使用@MappedSuperclass

對其進行註釋如果您根本沒有註釋超類,它就是被供應商認爲是短暫的,根本沒有映射。

編輯:順便問一下,你不必修改自己lastModified值(除非你真的想) - 你可以讓持久性提供爲你做它每次堅持實體與生命週期回調時間:

@PreUpdate 
void updateModificationTimestamp() { 
lastModified = System.currentTimeMillis(); 
} 
+2

許多感謝您Kostha - 「@ MappedSuperclass」註釋只是我正在尋找的解決方案。 – Dobbo

+0

不客氣:)我在代碼中注意到了另外一件事,也許你會發現它很有用 - 請參閱編輯。 – kostja

+0

再次感謝Kostja - 你的編輯正是我要去的地方。碰巧發生的情況是,我必須自己修改'lastModified',因爲(一些)實體對象與客戶端共享,數據通過XML和JAXB傳輸。 – Dobbo

0

您必須在AbstractEntity類的上方指定@MappedSuperclass註釋。 這意味着您要指定在AbstractEntity類中註釋的是您正在擴展此類的類的一部分。

而且您還關心jdbc表 - 映射的列名稱。