2017-04-25 8 views
0

私はSpring Boot + Hibernateアプリケーションで作業しています。私は、外来キーを含むOneToMany関係をどのように保存できるかを知りたかったのです。Spring Boot + Hibernateで動作しないOneToManyマッピング

私はOneToMany関係を持つ従業員と住所の2つのクラスを持っています。

@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; 
    } 
} 

ダオコード:

@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

UpdateへごEmployeeクラスでセッター:Employeeオブジェクトを保存する前に

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

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

こんにちはKishan、あなたの提案をありがとう。出来た。ちょうどこの質問を投稿して知りたかったので、サービスを変更して解決策を見つけました。 public従業員の退職(従業員){ \t \tセット

addresses = employee.getAddresses(); (アドレスアドレス:アドレス)のため \t \t { \t \t \t address.setEmployee(従業員) \t \t} \t \t return dao.save(employee); \t}したがって、これをPojoまたはサービスに組み込むのがベストプラクティスであることを確認したいと考えました。 –

+0

私はそれをPOJOに入れることをお勧めします。これは、住所の従業員フィールドが常に設定されることを保証するためです。従業員を他の場所にも保存する場合に備えてです。 – Kishan

0

は、すべてのアドレスオブジェクトには、その後、採用の参照を設定したアドレスの物語で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(); 
} 
関連する問題