2010-05-27 105 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