Spring数据一对多双向映射
Spring data one to many mapping bi-directional
我正在使用遗留系统,必须实现一些类似于以下问题的功能。
表是经理和部门,其中一名经理可以有多个部门,但一个部门确实只有一名经理。
经理
- manager_id。 -> 主键。
- manager_name.
- department_id.
部门
- dept_id。 -> 主键。
- dept_name.
- manager_id。这是对经理 table.
的引用
那些 table 没有外键或其他约束。
我的实现是,
一对多双向,因为我在 table 部门也有 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: returns 位经理以及每位经理的部门列表。
/managers/id: returns 一位经理及其部门列表。
- 删除:
/managers: 删除经理及其所有相关部门。
Post(添加):
除了按顺序生成的 Manager id 外,其他所有内容都设置为 null。当我查看日志时,它似乎首先调用插入,然后在管理器 table 上更新。我想更新会导致其所有属性出现空行为。此外,未插入部门 table。
JSON 我为插入传递的数据类似于:
{
"managerName": "John"
[{
"deptName": "Sales"
}]
}
注意:我的控制器有一些问题,它没有准确传递值,导致了空行为。
在 Manager 中更改部门初始化,分配一个空的 HashSet。
@OneToMany(mappedBy = "managers", cascade = CascadeType.ALL)
@JsonManagedReference
private Set<Department> departments=new HashSet<Department>();
我正在使用遗留系统,必须实现一些类似于以下问题的功能。 表是经理和部门,其中一名经理可以有多个部门,但一个部门确实只有一名经理。
经理
- manager_id。 -> 主键。
- manager_name.
- department_id.
部门
- dept_id。 -> 主键。
- dept_name.
- manager_id。这是对经理 table. 的引用
那些 table 没有外键或其他约束。
我的实现是, 一对多双向,因为我在 table 部门也有 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: returns 位经理以及每位经理的部门列表。 /managers/id: returns 一位经理及其部门列表。
- 删除: /managers: 删除经理及其所有相关部门。
Post(添加):
除了按顺序生成的 Manager id 外,其他所有内容都设置为 null。当我查看日志时,它似乎首先调用插入,然后在管理器 table 上更新。我想更新会导致其所有属性出现空行为。此外,未插入部门 table。 JSON 我为插入传递的数据类似于:
{ "managerName": "John" [{ "deptName": "Sales" }] }
注意:我的控制器有一些问题,它没有准确传递值,导致了空行为。
在 Manager 中更改部门初始化,分配一个空的 HashSet。
@OneToMany(mappedBy = "managers", cascade = CascadeType.ALL)
@JsonManagedReference
private Set<Department> departments=new HashSet<Department>();