【问题标题】:@OneToMany relationship issue while saving multiple values in Hibernate and Spring@OneToMany 在 Hibernate 和 Spring 中保存多个值时的关系问题
【发布时间】:2014-10-20 17:51:15
【问题描述】:

我有两个具有@OneToMany 双向关系的实体,如下所示:

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

员工类

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

最初我保存了 2 名员工,如下所示:

Employee emp= new Employee();
    emp.setName("John");
    emp.setEmail("John@gmail.com");
    employeeRepository.save(emp);

    Employee emp2= new Employee();
    emp2.setName("Smith");
    emp2.setEmail("smith@gmail.com");
    employeeRepository.save(emp2);

现在我想保存为以下 2 家不同公司工作的一名员工:

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);

它仅将第二个公司 ID 更新到员工表中。我希望将两家公司都分配给该员工。我该怎么做?

【问题讨论】:

    标签: spring hibernate jpa ejb-3.0


    【解决方案1】:

    这里的问题是你有一个一对多,而显然它应该是一个多对多,即。一个员工可以为多个公司工作,而一个公司有很多员工。

    您可以将关系更改为@ManyToMany(并在需要时使用@JoinTable),或者您可以创建另一个实体,例如,Employee 和 Company 与其具有一对多关系的 CompanyEmployee。后一种方法可能更可取,因为您可以记录有关关联的其他信息,例如开始日期、结束日期等。

    @Entity
    @Table(name = "company_employees")
    public class CompanyEmployee {
    
        @ManyToOne
        private Employee employee;
    
        @ManyToOne
        private Company company;
    
        private Date startDate;
    
        private Date endDate;
    
    }
    

    【讨论】:

    • 如果需要,我建议使用带 JoinTable 的 ManyToMany
    猜你喜欢
    • 2019-01-12
    • 2010-11-15
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多