2017-04-25 5 views
0

Ich arbeite an Spring Boot + Hibernate-Anwendung. Ich wollte wissen, wie ich die OneToMany-Beziehung einschließlich des Fremdschlüssels speichern kann.OneToMany Mapping funktioniert nicht im Frühjahr Boot + Hibernate

Ich habe 2 Klassen Mitarbeiter und Adresse, die OneToMany Beziehung hat.

@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 Code:

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

Wenn ich Daten versuche json Gesuch mit speichern als:

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

Seinem feinen Arbeiten ohne Fehler aber in der Datenbank in der Adresstabelle EMPID ist Null.

Bitte lassen Sie mich wissen, was ich falsch mache, da der Fremdschlüssel in der Adressentabelle nicht gespeichert wird.

Danke, Kamal

Antwort

0

Sie haben die 'Arbeitnehmer' Feld in der Adressklasse zu setzen.

Aktualisieren Sie die Setter in Ihrer Klasse Employee zu:

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

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

Hallo Kishan, Vielen Dank für Ihren Vorschlag. Es funktionierte. Wollte nur nach dem Posten dieser Frage wissen, ich habe auch die Lösung dafür gefunden, indem Sie den Service als öffentlichen Mitarbeiter speichern (Mitarbeiter) { \t \t Set

Adressen = employee.getAddresses(); \t \t für (Adresse Adresse: Adressen) { \t \t \t address.setEmployee (Angestellter); \t \t} \t \t zurück dao.save (Mitarbeiter); \t} Also, wollte überprüfen, was die beste Praxis sein sollte, um dies in Pojo oder auf Service zu setzen. –

+0

Ich ziehe es vor, es in das POJO zu legen, weil das garantiert, dass das Feld Adresse Mitarbeiter immer eingestellt wird - nur für den Fall, dass Sie den Mitarbeiter auch anderweitig speichern. – Kishan

0

Vor dem Employee-Objekt zu speichern, haben alle Adreßobjekte den employ Bezug zu setzen, so dann überwintern können EmpID in Adress Geschichte bevölkert.

@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(); 
} 
Verwandte Themen