0

我有两张桌子:

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

理想情况下,我根本不想处理订单。我只想让休眠使用产品列表中的顺序。我需要图像类中的产品和订单字段吗?

谁能指出我的注释应该如何或最好的方法是映射这类事情的正确方向?我真的不能在数据库中做任何事情,但我对 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);

因为订单仍然为空。

4

1 回答 1

0

Hibernate 支持排序集合,例如java.util.SortedMapjava.util.SortedSet。并且注释@Sort 允许您设置compartor 进行排序。查看参考文档

首先定义自己的 Comparator 类进行排序。重写方法以根据类中的值compare对 Set 进行排序。orderImage

class ImageComparator<Image> implements Comparator<Image> {

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

完成后,使用注释定义您的Product类以包含您的自定义比较器类。@SortImageComparator

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 回答