Spring数据一对多映射双向

时间:2016-10-28 11:49:30

标签: hibernate spring-data one-to-many

我正在使用遗留系统并且必须实现一些类似于以下问题的功能。 表是经理和部门,经理可以拥有多个部门,但部门只有一个经理。

管理器

  • MANAGER_ID。 - >主键。
  • MANAGER_NAME。
  • 部门标识。

  • 的dept_id。 - >首要的关键。
  • DEPT_NAME。
  • MANAGER_ID。这是对经理表的引用。

这些表格上没有外键或其他限制。

我的实施是,  因为我在Department表中也有manager_id,所以一对多是双向的。

我的代码段:

    @Entity
    @Table(name = "Manager_T")
    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    public class Manager {
        @Id
        @SequenceGenerator(name = "manager_id", sequenceName = "manager_id", allocationSize = 1)
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "manager_id")
        @Column(name="manager_id")
        private Long managerId;

        @Column(name="manager_name")
        private String managerName;

        @OneToMany(mappedBy = "managers", cascade = CascadeType.ALL)
        @JsonManagedReference
        private Set<Department> departments;

}

部门实体:

    @Entity
    @Table(name="Department_T")
    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
    public class Department {

        @Id
        @SequenceGenerator(name = "dept_id", sequenceName = "dept_id", allocationSize = 1)
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "dept_id")
        @Column(name="dept_id")
        private Long deptId;

        @Column(name="dept_name")
        private String deptName;

        // Only those departments for which manager exists.
        @ManyToOne(optional=false)
        @JoinColumn(name="manager_id")
        @JsonBackReference
        private Manager manager;

}

输出:对于ManagerController。

  • 获取:  /经理:返回经理以及每位经理的部门清单。  / managers / id:返回一个经理及其部门列表。
  • 删除:  /经理:删除经理及其所有相关部门。
  • 发布(添加):

    1. 除了顺序生成的Manager id之外,其他所有内容都设置为null。当我查看日志时,它首先调用insert然后在Manager表上更新。我猜更新导致其所有属性的null行为。此外,部门表未插入。 我通过插入的JSON数据类似于:

      {     &#34; managerName&#34;:&#34; John&#34;     [{         &#34; deptName&#34;:&#34; Sales&#34;     }] }

注意:我的控制器存在一些问题,它没有准确地传递该值而导致空行为。

1 个答案:

答案 0 :(得分:0)

在Manager中更改部门初始化,分配一个空的HashSet。

    @OneToMany(mappedBy = "managers", cascade = CascadeType.ALL)
    @JsonManagedReference
    private Set<Department> departments=new HashSet<Department>();