我有两张桌子:
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);
因为订单仍为空。
答案 0 :(得分:0)
Hibernate支持排序集合,例如java.util.SortedMap
和java.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
列表进行排序。