java - jpa @OneToMany 地图似乎不可能
问题描述
数据库表(不完全是 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<int,String>) 的映射,如下所示,有效,但这不是我想要的。
[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",
joinColumns = {@JoinColumn(name = "asset_id", referencedColumnName = "id")},
//inexistant - inverseJoinColumns = {@JoinColumn(name = "property_id", referencedColumnName = "id")})
@MapKeyJoinColumn(name = "definition_id")
Map<Definition,String> properties;
我想要一个值类型的映射值。我的“属性”表具有定义 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 确实支持它。
推荐阅读
- javascript - 当用户手动向上或向下滚动时重置当前部分计数器
- algorithm - 如何证明均匀分区是快速排序算法的最佳情况?
- android - 使用 java.io.IOException 不生成测试覆盖率报告
- c# - 抛出异常:UWP 后台任务中未知模块中的“System.TypeLoadException”
- c# - 使用 C# 在 MVVM 中使用组合框和按钮单击事件的不同方法?
- node.js - node-postgres 监听/通知超时
- android - 将数据从一个活动的 EditText 传输到另一个活动的 EditText
- php - 这是使用 PHP MySQL 设置用户访问级别的安全方法吗?
- android - 如何更新默认歌曲元数据?
- wordpress - woocommerce api是否有替代身份验证?