代码之家  ›  专栏  ›  技术社区  ›  Marci-man

Spring boot:如何使用Repository[closed]分别持久化一对多关系

  •  1
  • Marci-man  · 技术社区  · 6 年前

    我有两节课, 部门 员工 . 他们有一个 一对多 关系,即一个部门可以有许多员工。

    没有部门,员工就无法生存。
    部门可以有0到n个员工。

    我得到了这两个项目的清单。。。这些列表可以包含新条目和更新的条目。

    我的问题是,我该怎么做?

    1. 独立保存/合并部门
    2. 在步骤1之后保存/合并员工。独立(确保部门ID员工有,存在部门表)

    或者

    1. 使用保存/合并部门 Set<> 员工数量?

    或者

    有没有别的方法我还没想过呢?

    3 回复  |  直到 6 年前
        1
  •  4
  •   Max Farsikov    6 年前

    有两种模式叫做“Repository”和“Aggregate”,它们来自Eric Evans 领域驱动设计 书,使用其中一个是最佳实践。

    仓库模式

    • 两个独立实体(部门和员工)
    • 没有JPA关系( @OneToMany )实体之间
    • employee 只是包含它 departmentId 领域
    • 两个存储库( departmentRepo , employeeRepo )

    如果你要找员工的部门,应该是:

    department = departmentRepo.findById(employee.departmentId)
    

    保存实体也可以独立使用其存储库:

    newDepartment = departmentRepo.save(new Department())
    newEmployee = employeeRepo.save(new Employee(newDepartment.id))
    

    聚合模式

    与两个存储库不同,实体之间没有连接聚合模式使用:

    • 一个存储库( 部门回购 在这种情况下)
    • department 实体具有 @一对一 连接到 employees (部门包含员工)。

    在这种情况下,要获取员工,您必须使用部门存储库:

    employees = departmentRepo.findById(departmentId).employees
    

    保存的方法相同:您应该保存部门以保存员工的更改。

    扼要重述

    这些模式的任何混合(最常见的是:两个repo和实体之间的JPA关系)都会导致将来很难维护的问题。

    在大多数情况下,我更喜欢存储库模式:每个实体存储库,实体之间没有关系。

    在您的情况下,我会选择存储库模式。

        2
  •  3
  •   Aditya Narayan Dixit    6 年前

    可以按如下方式定义实体类:

    @Entity
    public class Department {
      @NotNull
      @Id
      private String depId;
      private String depName;
    
      @OneToMany(mappedBy = "department", cascade = CascadeType.ALL, fetch = FetchType.LAZY,
      orphanRemoval = true)
      private Set<Employee> employees;
    }
    
    @Entity
    public class Employee {
    
      @Id
      private String employeeId;
      private String employeeName;
      @ManyToOne
      @JoinColumn(name = "dep_id", nullable = true)
      private Department department;
    }
    

    保持部门在员工和员工在部门内的无效。您需要在这些实体上定义存储库来获取/保存。 另外,如果要使用一组employee,请确保它重写object类的hashcode()和equals()方法。

        3
  •  0
  •   vargapeti    6 年前

    在employee类中应该有一个department字段。无论何时更改员工与部门之间的关联,都需要设置employee.department,并在相应的department.employees集合中添加/删除员工。

    然后您只需要保存部门,假设已为department.employees集合正确设置CascadeType。