2

動機

私のアプリは、テーブル foo の内容に基づいて Web サービスにリクエストを送信します。これらのリクエストを(データベースに)記録したいと思います。また、それらを作成するために使用された foo の行の値も記録したいと思います。それでも、テーブル foo のデータは時間の経過とともに変化する可能性があるため、行の正確な内容 (ID ではなく) をログに記録する必要があります。私はHibernateを使用しているので、リクエストを表すエンティティにfooの行を埋め込むことができると思いました。クリーンなクラス階層を作成するには、次のようなものが必要です。

 class Foo
 {
   /*
    * Here goes some properties of Foo, which specify columns names etc.
    */
 }

 @Embeddable
 class EmbeddableFoo extends Foo
 {
   //EmbeddableFoo should have the same properties as Foo
 }

 @Entity
 class EntityFoo extends Foo
 {
   @Id
   Long getId() { //EntityFoo  has some id }
   //EntityFoo should have the same properties as Foo, except that
   //it has id
 }

問題

EmbeddableFooはFooのプロパティを認識しないため、これは機能しません。EntityFooがFooのプロパティを*見る*ように、Fooに@Inheritanceアノテーションを追加できますが、 EmbeddableFooに関する問題は解決しません。

質問

@Embeddableと @Entity* を同じクラスから継承させる簡単な (つまり、冗長なコードをたくさん書く必要がない) 方法はありますか?

4

1 に答える 1

2

注釈を確認しました@MappedSuperclassか?それはあなたが探しているものかもしれません。

http://docs.oracle.com/javaee/5/api/javax/persistence/MappedSuperclass.html

継承するエンティティにマッピング情報が適用されるクラスを指定します。マップされたスーパークラスには、個別のテーブルが定義されていません。

MappedSuperclass アノテーションで指定されたクラスは、マッピングされたスーパークラス自体のテーブルが存在しないため、マッピングがそのサブクラスにのみ適用されることを除いて、エンティティと同じ方法でマッピングできます。サブクラスに適用されると、継承されたマッピングはサブクラス テーブルのコンテキストで適用されます。このようなサブクラスでは、AttributeOverride および AssociationOverride アノテーションまたは対応する XML 要素を使用して、マッピング情報をオーバーライドできます。

于 2012-09-26T08:55:59.500 に答える