@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 列表,或者确保正好存在一个 PendingActionJobsPendingActionDetails.

@OneToMany List<PendingActionJobs>