微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jpa @OneToMany Map<SomeEntity,String> 似乎不可能

如何解决jpa @OneToMany Map<SomeEntity,String> 似乎不可能

数据库表(不完全是 sql,但你明白了要点..)

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 确实支持它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。