2017-04-26 79 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

创建存储位置条目的单独表格。该表的关键是“国家”和“城市”的组合键。然后,创建一个单独的地址表,其中包含“用户”的外键列和包含国家和城市的表格。