具有 3 个表的嵌套 OneToMany 映射

问题描述 投票:0回答:1

我有 3 个表,其架构如下:

表1:关键 主键:KEY_ID

表 2:KEY_VERSION: 主键:KEY_ID(KEY.KEY_ID 的外键)和 VERSION

表 3:KEY_VERSION_BLOCK: 主键:KEY_IDVERSION(外键为 KEY_VERSION.KEY_ID、KEY_VERSION.VERSION)、BLOCK_TYPE

我正在尝试使用 hibernate 建立这种关系,如下所示。

public class Key implements Serializable {
    @EmbeddedId
    private KeyId keyId;


    @OneToMany(mappedBy = "Key", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<KeyVersion> keyVersions;
.....
}
// Embedded ID is not required here as it has only one key column, I will replace it, please ignore for now
@Embeddable
public class KeyId implements Serializable {

    @Column(name = "KEY_ID", nullable = false)
    public Long keyId;

}
public class KeyVersion implements Serializable {

    @EmbeddedId
    private KeyVersionId versionId;

    @MapsId("KeyId")
    @JoinColumns({ @JoinColumn(name = "KEY_ID", referencedColumnName = "KEY_ID") })
    @ManyToOne
    public Key key;

  @OneToMany(mappedBy = "KeyVersion", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<KeyVersionBlock> keyVersionBlocks;

.....
}
@Embeddable
public class KeyVersionId implements Serializable {

    @ManyToOne
    private Key key;

    @Column(name = "VERSION")
    private Integer version;

.....
}
public class KeyVersionBlock implements Serializable {

    @EmbeddedId
    private KeyVersionBlockId keyVersionBlockId;

    @MapsId("keyVersionId")
    @JoinColumns({ @JoinColumn(name = "KEY_ID", referencedColumnName = "KEY_ID"),
        @JoinColumn(name = "VERSION", referencedColumnName = "VERSION") })
    @ManyToOne
    private KeyVersion keyVersion;

....
}

public class KeyVersionBlockId implements Serializable {

    @Column(name = "BLOCK_TYPE")
    private Long blockType;

    private KeyVersionId keyVersionId;

....
}

我遇到以下错误

引起的:org.hibernate.AnnotationException: ReferencedColumnNames(KEY_ID, VERSION) 的 com.akamai.portal.dexp.kms.core.model.KeyVersionBlock.keyVersion 未引用 com.akamai.portal.dexp.kms.core.model.KeyVersion 映射到单个属性 org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:203) 〜[hibernate-core-5.6.15.Final.jar:5.6.15.Final] 在 org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:104) 〜[hibernate-core-5.6.15.Final.jar:5.6.15.Final] 在 org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processEndOfQueue(InFlightMetadataCollectorImpl.java:1750) 〜[hibernate-core-5.6.15.Final.jar:5.6.15.Final]

请帮助我消除此错误或以其他方式建立这种关系。

我还尝试在

KEY_VERSION
表中添加以下内容,但这没有帮助:

@Column(name = "KEY_ID", nullable = false, updatable = false, insertable = false) private Long keyId;

java hibernate jpa one-to-many
1个回答
0
投票

JPA 不允许主键本身存在关系。 JPA 3.0 第 11.1.17 节:

嵌入 id 类中定义的关系映射不是 支持。

派生 ID 确实允许您在 ID 中引用引用类的键,因此您需要的是:

public class Key implements Serializable {
  @Id
  @Column(name = "KEY_ID", nullable = false)
  public Long keyId;


  @OneToMany(mappedBy = "Key", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
  private List<KeyVersion> keyVersions;
.....
}

public class KeyVersion implements Serializable {

  @EmbeddedId
  private KeyVersionId versionId;

  @MapsId("key")
  @JoinColumns({ @JoinColumn(name = "KEY_ID", referencedColumnName = "KEY_ID") })
  @ManyToOne
  public Key key;

  @OneToMany(mappedBy = "KeyVersion", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
  private List<KeyVersionBlock> keyVersionBlocks;

.....
}

@Embeddable
public class KeyVersionId implements Serializable {
  //named this way as this could be used as an ID class instead of embeddable
  private Long key;

  @Column(name = "VERSION")
  private Integer version;

.....
}

您拥有的 KeyVersionBlock 和 KeyVersionBlockId 应该可以工作,因为尽管嵌套了可嵌入项,关键对象中不再有任何关系。

© www.soinside.com 2019 - 2024. All rights reserved.