Hibernate中基本类型的ArrayList

时间:2010-05-27 09:13:07

标签: java hibernate database-design

我有一个关于整数的ArrayList或一般的原始类型的问题。假设我正在设计一个POS程序,每个产品可能有几个价格。

假设我可以使用int来表示价格值,而在Product类中,我有ArrayList<Integer> prices字段。使用Hibernate进行映射的最佳方法是什么?

我可以将它映射到product_prices表,其中包含一个包含价格值的字段和一个引用相关产品的外键字段,但这似乎有点过分了。

另一方面,我可以在String中连接所有价格,并将其存储在products表中的字段中,例如,用分号分隔价格。这样我就可以保存一个表和一个未来的select,但它似乎并不是OO。

这里有什么好处?

2 个答案:

答案 0 :(得分:8)

让我们忘记这里的样本(可能不是最好的样本)。使用Hibernate,您可以使用@CollectionOfElements注释(以及可选的@IndexColumn映射基本类型或可嵌入对象的集合以用于有序集合):

@Entity
public class Product {
    @Id @GeneratedValue
    private Long id;

    @CollectionOfElements @IndexColumn(name="price_index")
    private List<Integer> prices = new ArrayList<Integer>();

    ...
}

从语义上讲,它接近@OneToMany,除了集合的元素不是实体,它们没有id属性,它们的生命周期完全依赖于所有者对象。

从数据库的角度来看,这将导致产品的表格显示价格表:

create table Product (id bigint not null, primary key (id))
create table Product_prices (Product_id bigint not null, element integer, price_index integer not null, primary key (Product_id, price_index))
alter table Prodcut_prices add constraint FK9D26D06FB343359D foreign key (Product_id) references Product

在JPA 2.0中,此注释已标准化,因此如果您使用的是JPA 2.0,则更喜欢新的@ElementCollection注释。

话虽如此,对于产品和价格的特殊情况,@ duffymo所说的是非常正确的,并且它们可能不应该使用上述注释来实现。

答案 1 :(得分:5)

  

另一方面,我可以连接   字符串中的所有价格并将其存储为   product表中的一个字段,带有   价格以分号分隔,   例如。这样我就省了一个   表和未来的选择,但它   似乎并不是OO。

不,这不是关系型的。这破坏了第一个正常形式的规则。

我不明白为什么你担心保存表和SELECT。这是最糟糕的过早优化。

产品可能有多个价格,但也会有一些标准告诉您何时适用(例如,生效日期,折扣条件等)。您应该将它们添加到您的架构中。

我推荐一张Product表,其中没有任何定价或折扣信息。

如果Price有一个生效日期,听起来产品和价格之间存在多对多的关系,所以你也有一个Product_Price JOIN表。