2012-06-23 104 views
0

我有這樣的映射:爪哇休眠麻煩

實體1實體2實體3

而實體4個

實體編號1,2和3具有實體的清單4. 實體4具有隻有2字段的:一個字符串(數據)和我設置爲@Id和@GeneratedValue的ID

在保存實體4數據的數據庫表中,我不想讓字符串(數據)重複。

但實體1,2和3可以在它們的實體清單4中有重複的數據。

一個例子(實例是所指定的實體的對象):

Instance 1 (Entity 1): List: ["hi","hello","music"] 
Instance 2 (Entity 2): List: ["tv","hi","sofa"] 
Instance 3 (Entity 2): List: ["sofa","wii"] 
Instance 4 (Entity 3): List: ["music","otherString"]; 

爲實體4表中的條目應該是什麼分貝:
ID字符串
1喜
2喂
3音樂
4電視
5沙發
6 wii
7 otherStr荷蘭國際集團

什麼我得到是:
ID字符串
1喜
2喂
3音樂
4電視 5喜 6沙發
7沙發 8的Wii
9音樂
10 otherString

數據被複制。當我嘗試使用@Id註釋來提供字段字符串時,當我嘗試使用已存在的List中的字符串保存實體1,2或3的實例時,它會爲實體4發送一個重複的輸入錯誤,並執行不保存實體1,2或3.

如何正確註釋此?

我的一些代碼:

實體1,2或3(他們是在這部分代碼都一樣):

@Entity 
public class Entity1 { 
     private List<Entity4> entity4List; 

     @OneToMany(targetEntity=Entity4.class,cascade =CascadeType.ALL) 
     public List<Entity4> getEntity4List() { 
     return entity4List; 
     } 
    } 

實體4:

@Entity 
public class Entity4 { 

    private long id; 
     private String stringn; 

     @Id 
     @GeneratedValue 
     public long getId() { 
     return id; 
     } 
    } 

和我保存實體1,2或3的Hibernate代碼:

public void addEntity1(ArrayList<String> list){ 
List<Entity4> L = new ArrayList<Entity4>(); 
for(String s:list) 
{ 
    L.add(new Entity4(s)); 
} 
    Entity1 e=new Entity1(L); 
    Session session = sf.getCurrentSession(); 
     session.beginTransaction(); 
    session.save(e); 
    session.getTransaction().commit(); 
} 

回答

0

如果Entity4的數據字段應該是唯一的,那麼您應該對數據庫中的相應列有唯一的約束。

,並確保你不要在你的代碼中創建重複Entity4情況下,你應該

  • 在數據庫中搜索一個Entity4實例與此數據字段
  • 如果它已經存在,將其添加到列表中ENTITY1(或2或3)
  • ,如果它不存在,創建一個新的,它在ENTITY1添加到列表中(或2或3)

注意,您可能還有兩個線程che如果一個實體存在,並且同時這兩個線程同時創建一個新線程。這會由於數據庫中的唯一約束而導致其中一個線程發生異常。