使用列表索引作为密钥的一部分来休眠一对多列表

时间:2013-10-07 21:09:42

标签: hibernate list indexing annotations one-to-many

我有两张桌子:

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类有一个Image对象列表,其中包含image表中的所有字段,除了订单和产品ID(如果可能的话)。该列表应根据订单字段进行排序。

理想情况下,我根本不想处理订单。我只是希望hibernate使用Product中列表中的顺序。我是否需要图像类中的产品和订单字段?

任何人都可以指出我正确的方向,我的注释应该是什么样的,或者最好的方法是映射这种东西?我无法在数据库中做任何事情,但我对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);

因为订单仍为空。

1 个答案:

答案 0 :(得分:0)

Hibernate支持排序集合,例如java.util.SortedMapjava.util.SortedSet。注释@Sort允许您设置隔离区以进行排序。 Check out the reference document

首先定义您自己的Comparator类以进行排序。覆盖compare方法,根据order类中的Image值对该集进行排序。

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列表进行排序。