我正在研究一个棘手的多对多映射,我希望在我的实体中将其表示为地图。问题是,我希望映射键是关联表之一的列,而不是映射表的列,这通常是这种情况。
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
但没有运气。我只能找到映射键从连接表的列派生的示例。
我希望那里有人做过类似的事情,或者至少对如何实现这一点有一些智慧的话。
谢谢!