问题描述
deFinition (
id int,-- PK
type int,label varchar(20) -- deFinition label can change over time
)
asset (
id int,-- PK
-- other asset fields...
)
property (
id int,-- PK
asset_id int,-- with FK to asset + on delete cascade
deFinition_id int,-- with FK to deFinition + on delete cascade
payload varchar(256)
)
定义 id int 到有效载荷 (Map
[Asset class]
@ElementCollection
@CollectionTable(name = "properties",joinColumns = {@JoinColumn(name = "asset_id",referencedColumnName = "id")})
@MapKeyColumn(name = "deFinition_id")
@Column(name = "payload")
Map<Integer,String> properties;
相反,我试图在我的资产类中使用以下地图:
Map<DeFinition,String> properties;
但是不知道该怎么办。 @MapKeyJoinColumn 注释旨在从实体类型映射值中提取关系,因此我无法在下面完成此操作:
@OnetoMany(cascade = CascadeType.ALL)
@JoinTable(name = "properties",referencedColumnName = "id")},//inexistant - inverseJoinColumns = {@JoinColumn(name = "property_id",referencedColumnName = "id")})
@MapKeyJoinColumn(name = "deFinition_id")
Map<DeFinition,String> properties;
我想要一个值类型的映射值。我的“属性”表有 deFinition_id,所以我真的只需要 jpa/hibernate 来加入实体键的表,而不是值。
有什么线索吗?
解决方法
来自评论者,这是有效的:
[Asset class]
@ElementCollection
@CollectionTable(name = "properties",joinColumns = {@JoinColumn(name = "asset_id",referencedColumnName = "id")})
@MapKeyJoinColumn(name = "definition_id")
@Column(name = "payload")
Map<Definition,String> properties;
不直观的答案是强制@MapKeyJoinColumn 和关键实体类型,而不管@ElementCollection 是否存在。
我不知道这是否只是具有休眠功能的侥幸,还是 JPA 确实支持它。