我有 3 个表,其架构如下:
表1:关键 主键:KEY_ID
表 2:KEY_VERSION: 主键:KEY_ID(KEY.KEY_ID 的外键)和 VERSION
表 3:KEY_VERSION_BLOCK: 主键:KEY_ID、VERSION(外键为 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;
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 应该可以工作,因为尽管嵌套了可嵌入项,关键对象中不再有任何关系。