如何使用与基本类型的多个键的值具有相同实体的 Map
Posted
技术标签:
【中文标题】如何使用与基本类型的多个键的值具有相同实体的 Map【英文标题】:How to use a Map that has the same entity as the value for multiple keys of a basic type 【发布时间】:2020-07-10 18:14:50 【问题描述】:我正在阅读 Pro JPA 2,它给出了以下示例:
@Entity
public class Department
@Id private int id;
@OneToMany(mappedBy="department")
@MapKeyColumn(name="CUB_ID")
private Map<String, Employee> employeesByCubicle;
// ...
书中提到CUB_ID
将是Employee
实体表上的一列。但是,如何支持(或可以更改为支持)在多个隔间工作的同一员工,例如地图包含
"cube A1": "id":"1","name":"John Doe",
"cube A2": "id":"1","name":"John Doe"
【问题讨论】:
【参考方案1】: 您可以通过将部门端的关系更新为@ManytoMany
和@JoinTable
来做到这一点(您可以将@ManyToOne
保留在员工端或单向)
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable
@MapKeyColumn(name="CUB_ID", nullable = true)
private Map<String, Employee> employeesByCubicle;
输出:如您所见,它在两个隔间中都保留了对同一员工的引用
Employee employee = new Employee(1l, "Kav");
Map<String, Employee> map = new HashMap<>();
map.put("Cube1", employee);
map.put("Cube2", employee);
Department dep = new Department(1l, map);
employee.setDepartment(dep);
//Saved a department and an employee with 2 cubicles
departmentRepository.save(dep);
Department retrieved = departmentRepository.findById(employee.getId())
.get();
System.out.println(retrieved);
//Output
//Departmentid=1, employeesByCubicle=Cube1=Employeeid=1, name='Kav',
// Cube2=Employeeid=1, name='Kav'
您可以找到运行、插入数据、获取、打印然后关闭的程序。 https://github.com/kavi-kanap/stack-overflow-62840098
【讨论】:
以上是关于如何使用与基本类型的多个键的值具有相同实体的 Map的主要内容,如果未能解决你的问题,请参考以下文章
ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象