JPA 对两个 OneToMany 实体使用一个连接 table

JPA using one join table for two OneToMany entity

有一个实体Class'A'(应该是一个人),还有一个实体Class'B'(应该是一个合同)。

实体 'A' 与 Class 'B' 有关系 @OneToMany(一个人可以签署很多合同)。实体 'B' 也与 Class 'A' 有关系 @OneToMany(一个合同可以有很多人签署)。

在这种情况下,数据库中将有 2 个 JoinTable,但实际上它们在某种程度上是相同的。

我是否只使用一个 JoinTable 制作它们?

tnx 寻求帮助!

通过使用两个@OneToMany 就没有JoinTable。 你可以像这样使用@ManyToMany

@ManyToMany
  @JoinTable(
      name="AB",
      joinColumns=@JoinColumn(name="A_ID", referencedColumnName="ID"),
      inverseJoinColumns=@JoinColumn(name="B_ID", referencedColumnName="ID"))
  private List<B> bS;

看起来像我的@ManyToMany 关系...

在class人

@ManyToMany
@JoinTable(name="PERS_CONTRACTS")
public Set<Contract> getContracts() { return contracts; }

在class合同

@ManyToMany(mappedBy="contracts")
public Set<Person> getSigners() { return signers; }

它是一种多对多的关系。所以它只需要一个连接 table 就像数据库中的 person_contract 一样。它将包含如下列:

  1. Person_id
  2. Contract_id

其中 person_id 和 contract_id 都是复合唯一键。

在休眠状态下它将是: 1. 亲临现场 table

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "person_contract ", joinColumns = {
        @JoinColumn(name = "person_id", nullable = false, updatable = false) },
        inverseJoinColumns = { @JoinColumn(name = "contract_id",
                nullable = false, updatable = false) })
public Set<Contract> contracts;
  1. 合同中table

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "contracts") public Set<Person> persons;

情况:

你在这里把事情复杂化了,你的实体之间的适当关系应该是 ManyToMany,因为:

  • 一个person可以签很多contracts.
  • 并且一个contract可以被很多persons签名。

并且此关系中的一个 JoinTable 足以为您提供所需的所有详细信息:

  • 谁签署了给定的Contract
  • 其中 Contracts 签了 Person

映射:

所以你的映射将是这样的:

在你的 Person class:

@ManyToMany(mappedBy = "persons")
private Set<Contract> contracts= new HashSet<Contract>();

在你的 Contract class:

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
        name = "PERSONS_CONTRACTS",
        joinColumns = @JoinColumn(name = "CONTRACT_ID"),
        inverseJoinColumns = @JoinColumn(name = "PERSON_ID")
)
private Set<Person> persons= new HashSet<Person>();

您可以查看此 Hibernate Many-to-Many Association Annotations Example 了解更多详情。