0

別のエンティティに関連付けられているエンティティのリストを保存するために Java 永続性を使用しています。これは、私がいくつかの問題を抱えている場所の簡単な要約です。

@Entity public class Offer implements Serializable {
  @Id private Long offerId;

  @OneToMany
  @Column List<OfferCategory> offerCategories;
}

@Entity public class OfferCategory implements Serializable {

  @Embeddable public static class Id implements Serializable
  {
      @Column(name="offer_id")
      private Long offerId;

      @Column(name="category_id")
      private Long categoryId;

      public Id() {}

      public Id(Long offerId, Long categoryId) {
          this.offerId = offerId;
          this.categoryId = categoryId;
      }

      public boolean equals(Object o) {
          if(o != null && o instanceof Id) {
              Id other = (Id) o;
              return this.offerId.equals(other.offerId) &&
                      this.categoryId.equals(other.categoryId);
          }
          else
              return false;
      }

      public int hashCode() {
          return offerId.hashCode() + categoryId.hashCode();
      }
  }
  @EmbeddedId private Id id = new Id();
}

基本的に、変更できないアーキテクチャのため、オファーに割り当てられているカテゴリのリストを保存する必要があります。

現在、ユーザーからカテゴリのリストを取得し、それらをオファーの offerCategories フィールドに入れています。ただし、新しいアイテムの ID を設定する方法がないため、これは新しいオファーでは機能しません。

私は JPA と Seam を初めて使用するので、誰かが正しい方向に向けて微調整してくれれば、非常にありがたいです。

4

3 に答える 3

0

さて、今のところ私の解決策は、それぞれを永続化し(新しいエントリのキーを作成し)、次にそれらをリストに詰め込み、次にそれらをコンテナオブジェクトに詰め込み、次にそのオブジェクトを永続化することです。

于 2009-10-30T20:47:33.883 に答える
0

以前に複合 ID を使用したことはありませんが、@Column はフィールドが使用しているデータベース列のプロパティを変更するためにのみ使用されることに注意してください。関係を規定していないため、次のようなものが必要です。

@OneToMany    
List<OfferCategory> offerCategories;
于 2009-08-27T22:49:17.243 に答える
0

チュートリアルを調べたところ、次のことがわかりまし

IdentifierGenerator を使用して複合キーを生成することはできません。代わりに、アプリケーションは独自の識別子を割り当てる必要があります。

そのため、ID を自分で割り当てる必要があります。DB シーケンスを作成し、ネイティブ クエリでその値を取得することはできますか?
リスト マッピングを使用する場合 (オファー内のカテゴリの順序はデータベースによって定義されます)、リスト内のインデックスを含むインデックス列が必要です。カテゴリの順序が重要でない場合は、Set の方が便利です。

于 2009-08-28T14:44:05.830 に答える