【发布时间】:2019-09-06 22:03:58
【问题描述】:
我需要关于 KeyStoreEntity 与其 3 个子实体 (KeyPairEntity, SecretKeyEntity, CertificateEntity) 之间的多对多关系的建议。我将在此示例中使用CertificateEntity,因为其他 2 遵循相同的模式/问题。我的扩展类BaseRdbmsEntity 是一个@MappedSuperclass,具有id、name 和description 属性。
我对双方的@ManyToMany 没有任何问题,并在KeystoreEntity 方面使用Map<String, CertificateEntity> 通过他们的别名获取证书,并在CertificateEntity 上使用Map<String, KeyStoreEntity> 来获取别名和相关的密钥库。
然后我意识到我把它搞砸了,因为证书很容易在不同的密钥库中具有相同的别名......因此CertificateEntity 映射键可能会发生冲突,并且一个值会在存储库查询期间清除存储在其中的后续值。
我需要将CertificateEntity 中映射属性的键/值类型反转为Map<KeyStoreEntity, String>。我不清楚我如何使用@MapKeyValue(我意识到这不存在)将别名作为映射中的值......而不是作为键。
我试图通过使用@JoinTable 注释来解决此问题,但我没有看到与@MapKeyColumn 等效的映射值侧。我想要的是KeyStoreEntity 作为键和String alias 作为值。
@Entity(name = "keystores")
@Table(name = "pki_keystores")
public class KeyStoreEntity extends BaseRdbmsSecurityEntity
{
@MapKeyColumn(name="alias")
@ManyToMany
(
fetch = FetchType.LAZY,
cascade = {CascadeType.PERSIST, CascadeType.MERGE}
)
private Map<String, CertificateEntity> certificates;
...snip...
}
@Entity(name = "certificates")
@Table(name = "pki_certificates", uniqueConstraints = {
@UniqueConstraint(columnNames = {"issuerDn", "serialNumber"})
})
public class CertificateEntity extends BaseRdbmsSecurityEntity
{
@MapKeyColumn(name="alias")
@ManyToMany(
fetch = FetchType.LAZY,
cascade = {CascadeType.PERSIST, CascadeType.MERGE},
mappedBy = "certificates",
targetEntity = KeyStoreEntity.class
)
private Map<String, KeyStoreEntity> keystores;
// Map type for above needs to be <KeyStoreEntity, String>
...snip...
}
我希望延迟获取可以在关系的CertificateEntity.keystores 一侧使用反转的 k/v。我的期望是我只需要为keystores 属性调整/添加注释到CertificateEntity。
【问题讨论】:
标签: java hibernate dictionary jpa mapkeyjoincolumn