【问题标题】:JPA - How to create entities where EntityA saves list ids of another tableJPA - 如何创建EntityA保存另一个表的列表ID的实体
【发布时间】:2020-12-28 22:37:13
【问题描述】:

我有一个 EntityA 和 EntityB。

EntityB 是一个主表。

EntityA 可以有多个 Entity B 的 id。所以 EntityA 的一列应该包含 EntityB 的 id 列表/集。

我应该能够查询 EntityA,以获取 EntityB 的 Id 列表。

注意:EntityA 中的许多行可以引用 EntityB 的相同 id

我在下面尝试过,但我没有看到列

@OneToMany(mappedBy = "todo")
private List<ObjectStore> store = new ArrayList<>();

请问如何使用 Spring JPA 执行此操作。

编辑:

@Entity
public class Dept {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @NotNull(message = "name is mandatory")    
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

@Entity
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @NotNull(message = "name is mandatory")    
    private String name;

    @ElementCollection(targetClass=String.class)
    @CollectionTable(name = "DEPT", joinColumns = @JoinColumn(name="id"))
    private List<String> dept = new ArrayList<String>(4);
    
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }    
}

我观察到 DEPT 列已添加到 dept 表中。这是不需要的。

用例:员工可以持有部门列表。许多员工记录,应该能够有相同的部门参考。

【问题讨论】:

  • 发布您的 EntityA 和 EntityB 内容

标签: spring-boot jpa


【解决方案1】:

您应该从“DEPT”更改表名。因为@CollectionTable 将创建另一个具有给定名称的嵌入表。在您的情况下,部门已经存在,因此它将在部门中创建新列。

// Employee Class
    @ElementCollection(targetClass=String.class)
    @CollectionTable(name = "DEPT_EMPLOYEE_MAPPING", joinColumns = @JoinColumn(name="Employee_id"))
    @MapKeyJoinColumn(name="Dept_Id")
    private Map<Dept,DeptEmployeeRelationData> depts;

//Dept class 
    @ElementCollection
    @CollectionTable(name="DEPT_EMPLOYEE_MAPPING",joinColumns=@JoinColumn(name="Dept_Id"))
    @MapKeyJoinColumn(name="Employee_Id")
    Map<Employee, DeptEmployeeRelationData> employees;

    @Embeddable
    class DeptemployeeRelationData {
      @Column(name="createdAt")
      DateTime createdAt;
    }

您的映射是多对多的。 希望这会奏效!

【讨论】:

  • 如果使用@OneToMany,会创建哪些表? @JoinColumn 东西会允许重复吗?我遇到的问题是 - 我随机获得几个部门 ID 并设置为员工,如果另一个员工我得到类似的部门 ID - 约束违规错误
【解决方案2】:

我用过

 @ManyToMany
 @OrderColumn
 private List<String> dept = new ArrayList<String>(4);

并按照我的要求工作 DEPT,EMPLOYEE,EMPLOYEE_DEPT 创建

【讨论】:

    猜你喜欢
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2022-07-20
    • 1970-01-01
    • 2018-04-13
    • 2021-07-17
    • 1970-01-01
    相关资源
    最近更新 更多