如何使用与基本类型的多个键的值具有相同实体的 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的主要内容,如果未能解决你的问题,请参考以下文章

具有多个相同类型的值对象的聚合根问题

如何将字典的输出配对以打印具有相同键的值? [关闭]

SQLITE:选择共享相同外键的所有项目

ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象

同一列上具有多个外键的实体框架核心

具有多个相同类型的一对多关系的实体和GreenDAO