0

私は2つのテーブルを持っています:

CREATE TABLE product
(
  id serial NOT NULL,
  -- some other columns
  CONSTRAINT product_pkey PRIMARY KEY (id )
);

CREATE TABLE product_image
(
  product_id bigint NOT NULL,
  order integer NOT NULL,
  width integer NOT NULL,
  -- some other columns
  CONSTRAINT product_image_pk PRIMARY KEY (product_id , order ),
  CONSTRAINT product_image_product_fk FOREIGN KEY (product_id)
  REFERENCES product (id) 
);

私はこのようにマッピングしたい:

public class Product {
  ...
  List<Image> images;
  ...
}

public class Image {
  ...
  int width;
  ...
}

基本的に、Product クラスには、注文と製品 ID (可能な場合) を除くイメージ テーブルのすべてのフィールドを含む Image オブジェクトのリストが必要です。リストは順序フィールドに従ってソートする必要があります。

理想的には、注文を処理する必要はまったくありません。製品のリストからの順序を休止状態で使用したいだけです。画像クラスに商品フィールドと注文フィールドは必要ですか?

私の注釈がどのように機能するか、またはこの種のものをマッピングするための最良の方法について、誰かが私を正しい方向に向けることができますか? データベースでは何もできませんが、Java モデルについてはオープンです。

ありがとう!

編集:

私はこれを試しました:

@Entity
@Table(name = "product_image")
public class Image implements Comparable<Image>{

    @Id
    @Column(name = "order")
    private Integer order;

    @Id
    @ManyToOne
    @JoinColumn(name="product_id")
    private Product product;
}

@Entity
@Table(name = "product")
public class Product {

    @OneToMany(mappedBy="product", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @Sort(type = SortType.COMPARATOR, comparator = Image.class)
    @OrderColumn(name = "order")
    private List<Image> images;
}

データの読み取りには機能しますが、このコードは失敗します:

List<Image> images = new ArrayList<Image>();
Image i = new Image();
i.setProduct(product);
images.add(i);      
product.setImages(images);

session.save(product);

注文がまだ null であるためです。

4

1 に答える 1

0

Hibernate はjava.util.SortedMap、 およびのようなソートされたコレクションをサポートしjava.util.SortedSetます。また、アノテーション @Sort を使用すると、並べ替え用のコンパターを設定できます。参照ドキュメントを確認してください

まず、ソート用に独自の Comparator クラスを定義します。メソッドをオーバーライドして、クラスの値にcompare基づいて Set を並べ替えます。orderImage

class ImageComparator<Image> implements Comparator<Image> {

    @Override
    public int compare(Image o1, Image o2) {
        // implement compare method
    }
}

Productそれが完了したら、アノテーションを使用してクラスを定義@Sortし、カスタム コンパレータImageComparatorクラスを含めます。

public class Product {
    ...
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "id")
    @Sort(type = SortType.COMPARATOR, comparator = ImageComparator.class)
    SortedSet<Image> images;
    ...
}

これで、imagesリストがソートされます。

于 2013-10-08T04:45:20.483 に答える