首页 > 解决方案 > 是否可以在包含目标 + 连接字段的子类上使用 @JoinTable?

问题描述

我的模型(示例)如下:

CREATE TABLE person (
  id INT PRIMARY KEY,
  name TEXT
  ...
);

CREATE TABLE team (
  id INT PRIMARY KEY,
  name TEXT
  ....
);

CREATE TABLE team_reference_persons (
  team_id INT NOT NULL,
  person_id INT NOT NULL,
  uses_telephone BOOLEAN, 
  PRIMARY KEY (team_id, person_id),
  FOREIGN KEY (team_id) REFERENCES team(id),
  FOREIGN KEY (person_id) REFERENCES person(id)
);

还有我的 JPA 定义:

@Entity
@Table(name = "team")
public class Team {
    @Id
    private Integer id;

    @OneToMany
    @JoinTable(name = "team_reference_persons", joinColumns = @JoinColumn(name = "team_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "person_id", referencedColumnName = "id"))
    private List<Person> teamReferencePersons;
    ...
}

@Entity
@Table(name = "person")
public class Person {
    @Id
    private UUID id;
    private String name;
    ...
}

到目前为止,一切都很好,当您只需要团队中的人员列表时。但是现在我需要team_reference_persons.uses_telephone在我的个人域中添加连接表中的属性,所以我正在寻找一种方法来保持个人逻辑,同时我创建一个新的子类。

private class TeamIndividual extends Person {
    boolean uses_telephone;
}

然后List<Person>通过改变Team实体List<TeamIndividual>。这有可能吗?JPA 应该以如此巧妙的方式指示,它将连接表属性添加到最终目标实体(在读取和保存时)。

标签: javasqlspringjpaspring-data

解决方案


  • 无需将 TeamIndividual 扩展到 Person。
  • 使用 @Table(name = "team_reference_persons") 注释 TeamIndividual
  • 在 TeamIndividual 中定义字段(teamId、personId、uses_telephone)
  • 使用 @ManyToOne 和 @JoinColumn 注释字段 teamId 和 PersonId
  • 将列表添加到团队没有注释试试​​这个,它会工作..!!

推荐阅读