2017-04-26 98 views
0

在Hibernate中爲OneToMany映射進行插入操作。相同的數據插入兩次。在休眠狀態下爲OneToMany映射重複數據

員工:

@Entity 
public class Employee { 
    @Id 
    @GeneratedValue 
    private int empId; 
    private String name; 
    private String designation; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "employee", fetch = FetchType.EAGER, orphanRemoval = true) 
    private Set<Address> addresses = new HashSet<>(); 
} 

地址:

@Entity 
public class Address { 
    @Id 
    @GeneratedValue 
    private int addressID; 
    private String city; 
    private String country; 

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinColumn(name = "empId") 
    @JsonIgnore 
    private Employee employee; 
} 

當我使用POST請求來保存數據:對於第二

{ 
    "name": "Test1", 
    "designation": "SAL1", 
    "addresses": [ 
    { 
     "city": "Delhi", 
     "country": "India" 
    }, 
    { 
     "city": "Noida", 
     "country": "India" 
    } 
    ] 
} 

保存要求: 的第一個員工的保存要求員工:

{ 
    "name": "Test2", 
    "designation": "SAL2", 
    "addresses": [ 
    { 
     "city": "Delhi", 
     "country": "India" 
    }, 
    { 
     "city": "Noida", 
     "country": "India" 
    } 
    ] 
} 

在這種情況下,地址表中包含4個條目2,分別爲諾伊達:印度和德里:印度。

我想了解每個地址數據只有1個條目的最佳方式,即1個用於Noida:印度,1個用於Delhi:India。

+0

檢查您的請求是否被髮送兩次。 –

+0

不,我給兩個不同的僱員發送兩次,但我想如果我們已經有地址表中的地址它應該映射到,而不是在地址表中創建一個新的行。 –

+0

然後你需要創建一個包含國家和城市的組合鍵。看看複合鍵 –

回答

0

創建存儲位置條目的單獨表格。該表的關鍵是「國家」和「城市」的組合鍵。然後,創建一個單獨的地址表,其中包含「用戶」的外鍵列和包含國家和城市的表格。