JPA为两个OneToMany实体使用一个连接表

时间:2017-04-11 13:03:20

标签: java hibernate jpa hibernate-annotations

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

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

在这种情况下,数据库中会有2 JoinTable,但实际上它们两者都是相同的。

无论如何我只使用One JoinTable制作它们吗?

tnx任何帮助!

4 个答案:

答案 0 :(得分:1)

通过使用两个@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;

答案 1 :(得分:1)

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

类Person中的

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

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

答案 2 :(得分:1)

它是一种多对多关系。所以它只需要一个联结表,如数据库中的person_contract。它将包含以下列:

  1. PERSON_ID
  2. Contract_id
  3. 其中person_id和amp; contract_id将是一个复合唯一键。

    在休眠中它将是: 1.在人员表中

    @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. 在合约表

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

答案 3 :(得分:1)

<强>情况:

您在这里使事情变得复杂,您的实体之间的适当关系将是ManyToMany,因为:

  • person 可以签署许多 contracts
  • 许多 contract可以签署persons

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

  • 谁签名了Contract
  • 哪个Contracts签署了Person

<强>映射:

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

Person课程中:

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

在你的Contract课程中:

@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以获取更多详细信息。