2017-04-25 70 views
0

我正在开发Spring Boot + Hibernate应用程序。我想知道如何保存OneToMany关系,包括外键。OneToMany映射不能在Spring Boot + Hibernate中工作

我有2类雇员和地址有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) 
    private List<Address> addresses = new ArrayList<>(); 

    public List<Address> getAddresses() { 
     return addresses; 
    } 

    public void setAddresses(List<Address> addresses) { 
     this.addresses = addresses; 
    } 
} 


@Entity 
public class Address { 

    @Id 
    @GeneratedValue 
    private int addressID; 
    private String city; 
    private String country; 

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

    public Employee getEmployee() { 
     return employee; 
    } 

    public void setEmployee(Employee employee) { 
     this.employee = employee; 
    } 
} 

DAO代码:

@Repository 
public class EmployeeDao { 

    @Autowired 
    private SessionFactory sessionFactory; 

    public Employee save(Employee employee) { 
     Session session = getSession(); 
     session.persist(employee);  
     return employee; 

    } 

    private Session getSession() { 
     return sessionFactory.getCurrentSession(); 
    } 
} 

当我试图使用JSON POST请求来保存数据:

{ 
    "name": "Kamal Verma", 
    "designation": "SAL1", 
    "addresses": [ 
    { 
     "city": "Noida", 
     "country": "India" 
    } 
    ] 
} 

它没有任何错误,但在地址表EMPID数据库工作正常一片空白。

请让我知道我在做什么错,因为地址表中的外键没有被保存。

感谢, 卡迈勒

回答

0

你必须设置你的地址类中的“员工”字段。

更新二传手在你的员工类:

public void setAddresses(List<Address> addresses) { 
    this.addresses.clear(); 

    for (Address address: addresses) { 
     address.setEmployee(this); 
     this.addresses.add(address); 
    } 
} 
+0

嗨Kishan,非常感谢您的建议。有效。只是想知道后张贴这个问题,我也找到了解决方案,通过更改服务为 公共职员保存(员工雇员){ \t \t设置

addresses = employee.getAddresses(); \t \t(Address address:addresses){ \t \t \t address.setEmployee(employee); \t \t} \t \t return dao.save(employee); \t}所以,想要检查一下什么应该是最好的做法,把它放在Pojo或服务。 –

+0

我更喜欢将它放在POJO中,因为它保证Address员工字段将始终设置 - 以防万一您将员工保存在其他地方。 – Kishan

0

保存Employee对象前,所有的地址对象必须设定聘请参考这样的话Hibernate就可以在地址故事填充EMPID。

@Autowired 
private SessionFactory sessionFactory; 

public Employee save(Employee employee) { 
    Session session = getSession(); 
    for(Address address: employee.getAddresses()){ 
     address.setEmployee(employee); //Set employee to address. 
    } 
    session.persist(employee);  
    return employee; 

} 

private Session getSession() { 
    return sessionFactory.getCurrentSession(); 
} 
相关问题