2011-11-17 97 views
21

我在我的Java bean中有多對多的關係。當我使用List來定義我的變量,如:休眠多對多關係設置或列表?

@Entity 
@Table(name="ScD") 
public class Group extends Nameable { 

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER) 
    @JoinColumn(name="b_fk") 
    private List<R> r; 
    //or 
    private Set<R> r; 

我得到這個錯誤:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0' 
... 

當我使用Set一切似乎運作良好。

我想用多對多的關係,使用哪一個邏輯consept ListSet(因爲名單可能有重複和設置,但性能如何等問題)的時候問這個?

回答

52

從關係數據庫的角度來看,這是一個集合。數據庫不保存順序,使用List沒有意義,它們的順序沒有指定(除非使用所謂的索引的集合)。

使用Set也有很大的性能影響。當使用List時,Hibernate使用PersistentBag集合,其下有一些可怕的特徵。 I.e .:如果你添加一個新的關係,它將首先刪除所有現有的關係,然後將它們插回+你的新關係。用Set它只是插入新的記錄。

第三件事 - 你不能有多個List S IN一個實體,你會得到臭名昭著不能同時讀取多個袋例外。

參見:

+0

除了多對多的關係(一對一,多對一,多對多),我應該使用Set而不是List來獲得好的設計模式嗎? – kamaci

+0

是的,因爲'列表'表明項目的順序是不正確的。我知道,我知道它有稍微簡單的API。 –

+3

都投票接受作爲答案的詳細信息和良好的聯繫。 – kamaci

3

如何從設置的唯一性要求?這不會強制Hibernate在每次添加到集合中時檢索所有對象,以確保新添加的對象是唯一的嗎?列表不會有這個限制。

+1

列表也有這個限制,因爲hibernate需要在列表中保存順序,所以它也必須檢索所有項目 –