gpt4 book ai didi

java - 不共享任何外键关系的 JPA 实体之间的 @OneToOne 关系

转载 作者:行者123 更新时间:2023-12-02 07:30:26 25 4
gpt4 key购买 nike

我有两个实体,如下所示:

  • 发票
    • 主键是 InvoiceId
    • 其他感兴趣的列是[OrgId、VendorId、VendorInvoiceId]
  • 发票状态
    • 主键是 InvoiceStateId
    • 其他感兴趣的列是[OrgId、VendorId、VendorInvoiceId]

“其他感兴趣的列”在两个表中形成唯一键,但第二个表 InvoiceState 可以包含第一个表中没有对应记录的记录, 发票

在实体层,我想定义 Invoice 实体来包含对 InvoiceState 实体的引用,并定义了 @OneToOne 关系,其中@JoinColumns 如下:

@OneToOne
@JoinColumns
({
@JoinColumn(name="OrgId", referencedColumnName="OrgId"),
@JoinColumn(name="VendorId", referencedColumnName="VendorId"),
@JoinColumn(name="VendorInvoiceId", referencedColumnName="VendorInvoiceId")
})

但这会引发一个异常,即两个实体中的外键计数不相同。我什至没有在这两个表之间定义外键。

是否有一种方法可以在不共享外键但具有一组可在 JOIN 期间使用的列的两个实体之间定义 @OneToOne 关系?

最佳答案

我建议使用@Embeddable将上述3列映射为组件,并使用@Embedded使用该组件进行映射,并且定义连接条件。

例如如下:

  @Embeddable
public class ReferenceInfo {

private Long orgId = null;
private Long vendorId= null;
private Long vendorInvoiceId= null;

.........
.........
}


@Entity
public class Invoces{

private Long invoiceId = null;
private ReferenceInfo refInfo = null;
private InvoiceStates invoiceStates = null;

@Id
public Long getInvoiceId(){
return invoiceId;
}

......

@Embedded
public ReferenceInfo getRefInfo(){
....
}

@OneToOne(mappedBy="refInfo"))
public InvoiceStates getInvoiceStates(){
return invoiceStates;
}
}


@Entity
public class InvoiceStates {

private Long invoiceStateId = null;
private ReferenceInfo refInfo = null;

@Id
public Long getInvoiceStateId(){
return invoiceStateId;
}

......

@Embedded
public ReferenceInfo getRefInfo(){
....
}
}

关于java - 不共享任何外键关系的 JPA 实体之间的 @OneToOne 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12994903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com