2010-02-02 17 views
1

假設我有一個實體:故障持續列表時創建的字符串的獨特表<String>

@Entity 
public class AnEntity implements Serializable{ 
    @ElementCollection 
    private List<String> strings = new Vector<String>(); 
// other stuff 
} 

我使用的EclipseLink(JPA 2.0)。

此List中的字符串在許多AnEntity對象中可能具有相同的值。 也就是說,許多AnEntity對象可能會引用相同的字符串。

問題是@ElementCollection提供的默認映射在字符串表(ANENTITY_STRINGS)中留下了許多重複項。我如何映射這個以便當我保存字符串列表時,是否保存唯一的值,以便我沒有大量的重複字符串表?


我應該補充一點,我已經嘗試使用「佔位符」類,它有一個字符串的單個成員。不幸的是,這樣做會使相關表中的數據完全無法讀取,我相信它會被保存爲blob或lob。所以,比如我做了這樣的事情,而不是使用列表:

@ElementCollection 
@ManyToMany 
private List<StringWrapperClass> strings = new Vector<StringWrapperClass>(); 

然後我的實體看起來像:

@Entity 
public class StringWrapperClass implements Serializable { 
    private String string; 
    // other stuff, getters, setters, id, etc 
} 

但正如我所說,這使在ANENTITY_STRINGS只是字節。我無法想象這是做到這一點的「正確」方式。

回答

0

而不是使用Vector的,使用HashSet

因此,也許這樣做:

private Set<String> strings = new HashSet<String>(); 
+0

這沒有奏效,持久列表仍然有很多重複。要清楚的是,實體本身在其列表中不會有重複的字符串,它是包含所有重複項的表本身。 – 2010-02-02 15:57:03

1

所以,你要創建一個映射,其中每個AnEntity有很多串,每串可以屬於很多AnEntities。那麼你應該使用@ManyToMany,因爲它是一個多對多的關係。

+0

我也這麼認爲,但我仍然在ANENTITY_STRING表中找到很多重複項。這可以使用SQL很容易地完成,但我正在嘗試僅使用JPA 2.0來構建它以幫助提高DB便攜性。 – 2010-02-02 16:01:27

+0

@J_Y_C:我看不出如何在沒有重複的情況下在SQL中完成。您將在字符串表中(對於一對多關係)或連接表中(對於多對多關係)具有重複項, – axtavt 2010-02-02 16:11:49