6

いくつかのEJBエンティティが継承するいくつかの一般的な機能を提供する抽象クラスがあります。これらの1つは、タイムスタンプ列です。

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
4

2 に答える 2

15

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

スーパークラスのマッピングを定義していません。クエリ可能なタイプであると想定される場合は、注釈を付ける@Entity必要があり、属性も必要になり@Idます(この欠落している属性は、注釈@Idを追加した後に発生するエラーの理由です )@Entity

抽象スーパークラスをクエリ可能なエンティティにする必要はないが、そのサブクラスのテーブルの列として属性を設定したい場合は、次のように注釈を付ける必要があります。@MappedSuperclass

スーパークラスにアノテーションを付けない場合、プロバイダーによって一時的なものと見なされ、マッピングされません。

編集:ちなみに、lastModified値を自分で変更する必要はありません(本当に必要な場合を除く)-ライフサイクルコールバックを使用してエンティティを永続化するたびに、永続化プロバイダーに変更を任せることができます:

@PreUpdate
void updateModificationTimestamp() {
 lastModified = System.currentTimeMillis();
}
于 2013-01-17T12:53:58.480 に答える
0

AbstractEntityクラスの上に@MappedSuperclassアノテーションを指定する必要があります。これは、AbstractEntityクラスで注釈を付けたものが、このクラスを拡張するクラスの一部であることを指定していることを意味します。

また、jdbcテーブル(マッピングの列名)にも注意が必要です。

于 2013-03-20T13:09:57.277 に答える