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 一样。它将包含如下列:
- Person_id
- 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;
合同中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 了解更多详情。
有一个实体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 一样。它将包含如下列:
- Person_id
- 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;
合同中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 了解更多详情。