3

コンポーネントの最後のインスタンスを保持するエンティティがあります。

@Entity
public class Customer {
  ...
  @Embedded
  public ServiceCall getLastServiceCall() {...}
  ...
}

@Embeddable
public class ServiceCall() {
  public Date getDate();
  public Status getStatus();
}

別のテーブル結合を必要とせずServiceCallに呼び出すために、が埋め込まれています。customer.getLastServiceCall().getDate()

ServiceCallその関連付けを1対多にし、顧客に1つを埋め込んだまま、すべてのを保存し始めたいと思います。

Hibernateのドキュメント(私が使用しているv3.6)は次のように述べています。

埋め込み可能なオブジェクト(つまり、@ OneToOne、@ ManyToOne、@ OneToMany、または@ManyToMany)で関連付けアノテーションを使用することもできます。関連付け列をオーバーライドするには、@AssociationOverrideを使用できます。

そして、私がしなければならないのは@OneToManyLastServiceCall協会に追加することだけのようです。

それは私のために働きますか?そうでない場合、私の選択肢は何ですか?はいの場合、それは第2レベルのキャッシュにどのように影響しますか?また、その埋め込みインスタンスの更新に制限はありますか(不変オブジェクトを使用できます)?

4

2 に答える 2

4

@Embeded 型はデータベースに独自の ID を持つことは想定されていないため、ServiceCall の Customer クラスに @OneToMany を追加できないと思います。

  @OneToMany 
  @Embedded
  public ServiceCall getLastServiceCall() {...}

ただし、 @Embeded Service 呼び出し要素に関連付けを追加することもできます。

@Entity 
pubic class HistoricalServiceCall extends ServiceCall 
{
   @Id 
   private String id; 

}


@Embeddable 
public class ServiceCall {

   @OneToMany(fetch=FetchType.LAZY)
   @JoinColumn(name="join_column_defined_on_customer_table")
   List<HistoricalServiceCall> getServiceCallHistory(); 
}

更新: FetchType.LAZY を getServiceCallHistory() に配置することは、JPA プロバイダーが getServiceCallHistory を呼び出すまで待ってから、別の選択を行ってその関連付けをプルするようにするためのヒントです。

したがって、私が説明しているセットアップでは、customer.getLastServiceCall().getDate() を実行すると、関係が遅延する前に ServiceCallHistory が取り込まれません。

于 2012-06-24T13:19:24.220 に答える
1

必要なものは次のとおりです。

  • 顧客エンティティ
  • 埋め込み可能なServiceCall
  • HistoricalServiceCallエンティティ。

顧客には、埋め込まれたServiceCallフィールド(最後のサービス呼び出し)が含まれている必要があります。

HistoricalServiceCallエンティティには、ID、埋め込みServiceCallフィールド(HistoricalServiceCallのデータ)、およびOneToManyを双方向にする場合は、顧客へのManyToOneアソシエーションが必要です。

お客様は、HistoricalServiceCallへのOneToManyアソシエーションを持っている必要があります。

于 2012-06-24T18:53:53.340 に答える