@OneToOne 映射与 joincolumn
@OneToOne mapping with joincolumn
我在两个 class 之间有 @OneToOne
关系,结构如下:
A 类是 PendingActionJobs:
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "Pending_Actions_Detail_Fk")
public PendingActionDetails getActionDetailsFk() {
return actionDetailsFk;
}
public void setActionDetailsFk(PendingActionDetails aActionDetailsFk) {
actionDetailsFk = aActionDetailsFk;
}
ClassB 被称为 PendingActionDetails:
@OneToOne(mappedBy = "actionDetailsFk", fetch = FetchType.LAZY)
public PendingActionJobs getPendingJob() {
return pendingJob;
}
public void setPendingJob(PendingActionJobs aPendingJob) {
pendingJob = aPendingJob;
}
因此,挂起的操作作业 table 具有指向 PendingActionsDetail table 中主键的 FK。 PendingActionJobs table 有许多重复的 Fk,它们映射到细节中的某些 pk table,例如:
Pk FK to the PendingActionsDetail
2 1
3 1
4 1
5 1
6 1
7 1
The PendingActionsDetail has only one primary key like:
Pk
1
当我打电话给
createQuery("from PendingActionDetails details LEFT JOIN FETCH details.pendingJob")
它检索集合但是当我尝试从另一端获取数据时,即从 FK table 它说
createQuery("from PendingActionJobs jobs LEFT JOIN FETCH jobs.actionDetailsFk")
它说 - 为 class PendingActionJobs 找到了具有相同标识符的多行。等效的 sql 语句应该是:
select * from Pending_Actions_Job jobs
left join
Pending_Actions_Details details
on jobs.Pending_Actions_Detail_Fk =
details.Pending_Actions_Details_Primary_Key
但是为什么休眠会抛出错误?我只想用 PendingActionDetails Pk 中的数据填充 PendingActionJobs FK 的每一行。它为什么抱怨?换句话说,我无法从双方获取数据,但我必须使用 PendingActionsDetails class?
根据您解释的场景,您需要 OneToMany 映射而不是 OneToOne。查看两个映射的定义。
一对一映射
Java 中的 OneToOne
关系是源对象具有引用另一个目标对象的属性,并且(如果)该目标对象与源对象具有反向关系,它也会成为 OneToOne
关系。
一对多映射
Java 中的 OneToMany
关系是源对象具有存储目标对象集合的属性的位置,如果这些目标对象与源对象具有反向关系,则它将是多对一关系。
为了解决这个问题,请更新您的 PendingActionDetails class 以存储如下所示的 PendingActionDetails 列表,或者确保正好存在一个 PendingActionJobs
每 PendingActionDetails
.
@OneToMany
List<PendingActionJobs>
我在两个 class 之间有 @OneToOne
关系,结构如下:
A 类是 PendingActionJobs:
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "Pending_Actions_Detail_Fk")
public PendingActionDetails getActionDetailsFk() {
return actionDetailsFk;
}
public void setActionDetailsFk(PendingActionDetails aActionDetailsFk) {
actionDetailsFk = aActionDetailsFk;
}
ClassB 被称为 PendingActionDetails:
@OneToOne(mappedBy = "actionDetailsFk", fetch = FetchType.LAZY)
public PendingActionJobs getPendingJob() {
return pendingJob;
}
public void setPendingJob(PendingActionJobs aPendingJob) {
pendingJob = aPendingJob;
}
因此,挂起的操作作业 table 具有指向 PendingActionsDetail table 中主键的 FK。 PendingActionJobs table 有许多重复的 Fk,它们映射到细节中的某些 pk table,例如:
Pk FK to the PendingActionsDetail
2 1
3 1
4 1
5 1
6 1
7 1
The PendingActionsDetail has only one primary key like:
Pk
1
当我打电话给
createQuery("from PendingActionDetails details LEFT JOIN FETCH details.pendingJob")
它检索集合但是当我尝试从另一端获取数据时,即从 FK table 它说
createQuery("from PendingActionJobs jobs LEFT JOIN FETCH jobs.actionDetailsFk")
它说 - 为 class PendingActionJobs 找到了具有相同标识符的多行。等效的 sql 语句应该是:
select * from Pending_Actions_Job jobs
left join
Pending_Actions_Details details
on jobs.Pending_Actions_Detail_Fk =
details.Pending_Actions_Details_Primary_Key
但是为什么休眠会抛出错误?我只想用 PendingActionDetails Pk 中的数据填充 PendingActionJobs FK 的每一行。它为什么抱怨?换句话说,我无法从双方获取数据,但我必须使用 PendingActionsDetails class?
根据您解释的场景,您需要 OneToMany 映射而不是 OneToOne。查看两个映射的定义。
一对一映射
Java 中的 OneToOne
关系是源对象具有引用另一个目标对象的属性,并且(如果)该目标对象与源对象具有反向关系,它也会成为 OneToOne
关系。
一对多映射
Java 中的 OneToMany
关系是源对象具有存储目标对象集合的属性的位置,如果这些目标对象与源对象具有反向关系,则它将是多对一关系。
为了解决这个问题,请更新您的 PendingActionDetails class 以存储如下所示的 PendingActionDetails 列表,或者确保正好存在一个 PendingActionJobs
每 PendingActionDetails
.
@OneToMany
List<PendingActionJobs>