2013-01-17 14 views
5

私は、継承するいくつかのEJBエンティティに共通するいくつかの共通の機能を提供する抽象クラスを用意しています。これらの1つはタイムスタンプ列です。抽象クラス継承を持つ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()); 
    } 
} 

問題は、タイムスタンプ列は、データベーステーブルに追加されていないことです。 lastModifiedフィールドを列として継承するために、AbstractEntityに追加する必要がある注釈がありますか?

@EntityをAbstractEntityに追加しようとしましたが、展開時に例外が発生しました。

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

答えて

13

ここにはいくつかの可能性があります。

スーパークラスのマッピングを定義していません。照会可能なタイプであると考えられる場合は、@Entityでそれに注釈を付ける必要がありますしている場合、あなたはまた、

(この行方不明@Id属性はあなたが@Entity注釈を追加した後に取得しているエラーの理由です)@Id属性が必要になります抽象スーパークラスをクエリー可能なエンティティにする必要はありませんが、そのサブクラスのテーブルに属性としてカラムを持たせたい場合は、サブタイトルの表にカラムを追加する必要があります。@MappedSuperclass

スーパークラスに注釈を付けない場合は、プロバイダによって一時的であるとみなされ、まったくマッピングされません。

EDIT:(あなたが本当にしたい除く)ところで、あなたはlastModified値を自分で変更する必要はありません - あなたは、持続性プロバイダがあなたのためにあなたがライフサイクルコールバックを持つエンティティを永続化するたびにそれをやらせることができます:

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

多くのありがとうコスタ - '@ MappedSuperclass'アノテーションは私が探していた解決策でした。 – Dobbo

+0

あなたは歓迎です:)私はあなたのコードで気づいたことがもう1つあります。おそらくそれが役に立つと思うかもしれません - 編集を見てください。 – kostja

+0

もう一度ありがとうKostja - あなたの編集は私が行っていた場所です。それが起きると、(最後の)エンティティオブジェクトがクライアントと共有され、XMLとJAXBを介してデータが転送されるため、自分自身をlastModifiedに変更する必要があります。 – Dobbo

0

上記の@MappedSuperclass注釈は、AbstractEntityクラスの上に指定する必要があります。 これは、AbstractEntityクラスでアノテートした文字列が、このクラスを拡張するクラスの一部であることを指定していることを意味します。

また、jdbcテーブルのマッピングの列名にも注意してください。

関連する問題