user1188867
user1188867

Reputation: 3978

@OneToMany relationship issue while saving multiple values in Hibernate and Spring

I have two entities with @OneToMany bidirectional relationship as below:

 @Entity
public class Company {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer companyId;
    private String name;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy="company")
    Set<Employee> employees = new LinkedHashSet<>();

Employee class

@Entity
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer empId;
    private String name;
    private String address;
    private String email;

    @ManyToOne
    @JoinColumn(name="companyId")
    Company company;

Intially i saved 2 employees as below:

Employee emp= new Employee();
    emp.setName("John");
    emp.setEmail("[email protected]");
    employeeRepository.save(emp);

    Employee emp2= new Employee();
    emp2.setName("Smith");
    emp2.setEmail("[email protected]");
    employeeRepository.save(emp2);

Employee Table

Now I want to save one employee working for 2 different companies like below:

Company company =new Company();
    company.setName("Google");
    Employee emp = employeeRepository.findOne(1);
    company.getEmployees().add(emp);
    emp.setCompany(company);
    companyRepository.save(company);

    Company company2 =new Company();
    company2.setName("Microsoft");
    company2.getEmployees().add(emp);
    emp.setCompany(company2);
    companyRepository.save(company2);

It is updating only second company id into employee table. I want both the companies to be assigned to that employee. How can I do that?

Upvotes: 0

Views: 392

Answers (1)

Alan Hay
Alan Hay

Reputation: 23226

The issue here is that you have a one-to-many when obviously it should be a many-to-many, viz. an employee can work for more than one company and a company has many employees.

You can either change the relationship to a @ManyToMany (and use @JoinTable if required) or you can create another entity, say, CompanyEmployee to which both Employee and Company have a one-to-many-relationship. The latter approach is probably preferable as you can then record additional information about the association e.g. start_date, end-date etc.

@Entity
@Table(name = "company_employees")
public class CompanyEmployee {

    @ManyToOne
    private Employee employee;

    @ManyToOne
    private Company company;

    private Date startDate;

    private Date endDate;

}

Upvotes: 2

Related Questions