Pin*_*Pin 2 java database-design hibernate
我有一个关于整数的ArrayList或一般的原始类型的问题.假设我正在设计一个POS程序,每个产品可能有几个价格.
假设我可以用ints 表示价格值,在Product类中我有字段ArrayList<Integer> prices.使用Hibernate进行映射的最佳方法是什么?
我可以将它映射到一个product_prices表,其中包含一个包含价格值的字段和一个引用相关产品的外键字段,但这似乎有些过分.
另一方面,我可以连接a中的所有价格String并将其存储为products表中的字段,例如,用分号分隔价格.这样我就节省了一张桌子和一张未来select,但它似乎并不是OO.
这里最好做什么?
让我们忘记这里的样本(可能不是最好的样本).使用Hibernate,您可以使用@CollectionOfElements注释(以及可选的@IndexColumn有序集合)映射基本类型或可嵌入对象的集合:
@Entity
public class Product {
@Id @GeneratedValue
private Long id;
@CollectionOfElements @IndexColumn(name="price_index")
private List<Integer> prices = new ArrayList<Integer>();
...
}
Run Code Online (Sandbox Code Playgroud)
在语义上,这接近于a,@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所说的是非常真实的,并且它们可能不应该使用所提到的注释来实现.
另一方面,我可以在String中连接所有价格并将其存储在products表中的字段中,例如,用分号分隔价格.这样我就可以保存一个表和一个未来的选择,但它似乎并不是OO.
不,这不是关系型的.这破坏了第一范式的规则.
我不明白为什么你担心保存表和SELECT.这是最糟糕的过早优化.
产品可能有多个价格,但也会有一些标准告诉您何时适用(例如,生效日期,折扣条件等)您也应该将这些标准添加到您的模式中.
我推荐一个Product表,其中没有任何定价或折扣信息.
如果Price有一个生效日期,听起来产品和价格之间存在多对多的关系,所以你也有一个Product_Price JOIN表.