gpt4 book ai didi

hibernate ManyToMany Map 其中映射键是通过 FK 引用的属性

转载 作者:行者123 更新时间:2023-12-03 06:52:02 25 4
gpt4 key购买 nike

我正在处理一个棘手的多对多映射,我希望将其在我的实体中表示为 map 。问题是,我希望映射键是关联表之一中的列,而不是通常情况下的映射表列。

Account 保存有关用户的基本信息,AccountMetadata 定义帐户可能具有的所有可能属性,Account_MetadataAccount 为每个可能的 AccountMetadata 定义特定帐户的值。

我已将它们映射到以下实体:

@Entity
@Table(name = "ACCOUNT")
public class Account implements Serializable
{
@Id
@Column(name = "ACCOUNT_ID")
private Long accountId;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "pk.account")
private Set<AccountMetadataAccount> metadata = new HashSet<AccountMetadataAccount>();
...
}

@Entity
@Table(name = "ACCOUNT_METADATA")
public class AccountMetadata implements Serializable
{
@Id
@Column(name = "ACCOUNT_METADATA_ID")
private Long accountMetadataId;

@Column(name = "KEY", unique = true)
private String key;

@Column(name = "TYPE")
private Class<?> type;
...
}

@Entity
@Table(name = "ACCOUNT_METADATA_ACCOUNT")
@AssociationOverrides({
@AssociationOverride(name = "pk.account",
joinColumns = @JoinColumn(name = "ACCOUNT_ID")),
@AssociationOverride(name = "pk.metadata",
joinColumns = @JoinColumn(name = "ACCOUNT_METADATA_ID"))
})
public class AccountMetadataAccount implements Serializable
{
@EmbeddedId
private AccountMetadataAccountId pk;

@Column(name = "VALUE")
private Serializable value;
...
}

@Embeddable
public class AccountMetadataAccountId implements Serializable
{
@ManyToOne
private AccountInfo account;

@ManyToOne
private AccountMetadataInfo metadata;
...
}

这一切都很好。我的问题是帐户的元数据集。这并不理想。如果我有一个元数据键想要查找其值,我必须迭代整个 Set 直到找到正确的条目。在我们的系统中,可能有数百个这样的。我以为Map<String, AccountMetadataAccount>Map<String, Serializable>会更理想。但是,我希望映射键是 AccountMetadata 键。

我一直在尝试 @MapKeyColumn@MapKeyJoinColumn没有运气。我只能找到映射键从连接表的列派生的示例。

我希望有人做过类似的事情,或者至少有一些关于如何实现这一目标的智慧之言。

谢谢!

最佳答案

使用 getter 和 setter 代替成员变量怎么样?像这样:

@Transient
private Map<String, AccountMetadataAccount> metadata = new HashMap<>();

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "pk.account")
private Collection<AccountMetadataAccount> getMetadata() {
return metadata.values();
}

private void setMetadata(Collection<AccountMetadataAccount> metaSet) {
metadata.clear();
for (AccountMetadataAccount meta : metaSet) {
metadata.put(meta.key, meta);
}
}

我使用 xml 映射文件而不是注释,并且我没有测试代码,所以它可能不是 100% 正确,但你应该明白这个想法。

关于hibernate ManyToMany Map<String, Entity> 其中映射键是通过 FK 引用的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12943622/

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