Hibernate中基本类型的ArrayList
我有一个关于整数的ArrayList或一般的原始类型的问题。 假设我正在设计一个POS程序,每个产品可能有几个价格。
假设我可以用int
表示价格值,而在Product
类中我有字段ArrayList prices
。 使用Hibernate进行映射的最佳方法是什么?
我可以将它映射到product_prices
表,其中包含一个包含价格值的字段和一个引用相关产品的外键字段,但这似乎有点过分。
另一方面,我可以在String
连接所有价格并将其存储在products
表中的字段中,例如,用分号分隔价格。 这样我就可以保存一个表和一个未来的select
,但它似乎并不是OO。
这里最好做什么?
另一方面,我可以在String中连接所有价格并将其存储在products表中的字段中,例如,用分号分隔价格。 这样我就可以保存一个表和一个未来的选择,但它似乎并不是OO。
不,这不是关系型的。 这违反了第一个正常forms的规则。
我不明白为什么你担心保存表和SELECT。 这是最糟糕的过早优化。
产品可能有多个价格,但也会有一些标准告诉您何时适用(例如,生效日期,折扣条件等)您也应该将这些标准添加到您的模式中。
我推荐一个Product表,其中没有任何定价或折扣信息。
如果Price有一个生效日期,听起来产品和价格之间存在多对多的关系,所以你也有一个Product_Price JOIN表。
让我们忘记这里的样本(可能不是最好的样本)。 使用Hibernate,您可以使用@CollectionOfElements
批注(以及可选的@IndexColumn
用于有序集合)映射基本类型或可嵌入对象的集合:
@Entity public class Product { @Id @GeneratedValue private Long id; @CollectionOfElements @IndexColumn(name="price_index") private List prices = new ArrayList (); ... }
从语义@OneToMany
,它接近@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添加约束FK9D26D06FB343359D外键(Product_id)引用产品
在JPA 2.0中,此注释已标准化,因此如果您使用的是JPA 2.0,则更喜欢新的@ElementCollection
注释。
话虽如此,对于产品和价格的特殊情况,@ duffymo所说的是非常真实的,并且它们可能不应该使用所提到的注释来实现。
- make Eclipse equals()/ hashCode()使用getters
- 使用Spring和Hibernate的嵌套事务
- 无法创建请求的服务
- NoClassDefFoundError:javax / validation /validation甚至在POM中validation-api 1.1.0.Final
- Hibernate Criteria API:获得n个随机行
- SpringMVC和Hibernate:CannotCreateTransactionException:无法打开Hibernate Session进行事务处理;
- Hibernate双向父/子问题
- 需要一个Hibernate中主键@OneToOne映射的示例
- hibernate的替代品