2010-05-27 79 views
1

我有一个关于整数的ArrayList或基本类型的问题。假设我正在设计一个POS程序,每个产品可能有多个价格。Hibernate中的基本类型的ArrayList

让我们假设我可以用int s和Product类表示一个价格值,我有ArrayList<Integer> prices这个字段。用Hibernate映射这个最好的方法是什么?

我可以将它映射到一个product_prices表,其中一个字段包含价格值和用于引用相关产品的外键的字段,但这看起来有点矫枉过正。

另一方面,我可以连接String中的所有价格,并将其作为字段存储在products表中,例如,价格用分号分隔。这样我就节省了一张桌子和一个未来的select,但它看起来不像OO。

这里做什么最好?

回答

5

在另一方面,我可以在一个字符串拼接 所有的价格和它的字段存储为 在产品表,与 用分号, 例如分离的价格。这种方式我保存了一个 表和未来的选择,但它 似乎不太OO。

不,它不是关系。这违反了第一范式的规则。

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

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

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

这听起来像是如果Price中有生效日期,那么产品和价格之间会存在多对多的关系,因此您还需要一个Product_Price JOIN表。

+0

好的,谢谢,你说的都很有道理。 – Pin 2010-05-27 09:45:13

8

让我们忘了这里的示例(这可能不是最好的)。使用Hibernate,可以映射基本类型或与@CollectionOfElements注释embeddedable对象的集合(和可选的@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,这个注释已经标准化,从而更喜欢新@ElementCollection注释如果您使用JPA 2.0。

这就是说,对于产品和价格的特殊情况,@duffymo所说的是非常真实的,他们可能不应该使用提到的注释来实现。

+0

我认为这个解决方案有其优点。并非每个枚举类型都需要在数据库中拥有自己的表,并且添加'@ ElementConnection'注释所需的工作量与将枚举重构为适当的实体并使用所需值填充表的能力之间的差异可以通过意义重大。 – aroth 2012-08-27 04:56:41

+0

此解决方案意味着数据库Product_prices中有一个额外的表。真正的问题是如何在适当的情况下没有额外的表格来做到这一点。 – 2013-05-03 16:52:05