JPA可选关系

JPA optional relationship

我正在使用 EclipseLink。

我有一个与 DIDAllocation 具有一对多关系的实体 DIDRequest。

DIDRequest 并不总是有关联的 DIDAllocation(即 DIDAlloction 应该是可选的)。

我有以下实体

@Entity
@Table(name = "tblDIDRequest")
public class DIDRequest 
{
    int id;
    @ManyToOne(optional = true)
    private DIDAllocation didAllocation;
}

optional 参数似乎不起作用,因为 EclipseLink 正在生成一个外键约束,如下所示:

CREATE TABLE `tblDIDRequest` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `DIDALLOCATION_ID` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `FK_tblDIDRequest_DIDALLOCATION_ID` (`DIDALLOCATION_ID`),
  CONSTRAINT `FK_tblDIDRequest_DIDALLOCATION_ID` FOREIGN KEY (`DIDALLOCATION_ID`) REFERENCES `tblDIDAllocation` (`ID`),

);

如何修改注释使其不生成外键约束?

有没有一种方法可以有约束,所以如果 didAllocation 存在,那么一定有一个相关的实体,但如果它为 null 我们不关心?

这就像它应该的那样工作!

A required 关联可以通过在列上设置 NOT NULL 约束(以确保它具有值)以及 FOREIGN KEY 约束来映射,以确保值对应另一个table.

中的ID

如果您有一个 optional 关联,您仍然需要一个 FOREIGN KEY 约束,所以您不能只是将乱码放入列中。但是你没有 NOT NULL 约束,所以 NULL 表示 "the association is not present".

`DIDALLOCATION_ID` bigint(20) DEFAULT NULL,

这是可以为 null 的,默认值为 NULL。

您可能还想在关联上设置 fetch = FetchType.LAZY 并明确地 join/eager-fetch 只有在需要时才设置它 - 以提高效率。总的来说,我强烈推荐 Vlad Mihalcea 的所有文章,以了解有关高效使用 JPA 的更多信息:https://vladmihalcea.com/manytoone-jpa-hibernate/