java - JPA - 多对多作为 ElementCollection
问题描述
我有一个多对多的关系,将标签(除了字符串)分配给项目:
+------+ +------------+ +-------+
| ITEM | | ITEM_LABEL | | LABEL |
|------| |------------| |-------|
| ID |<->| ITEM_ID | ┌>| ID |
|------| |------------| | |-------|
| .... | | LABEL_ID |<┘ | TEXT |
+------+ +------------+ +-------+
...而且我想避免为标签表创建 POJO 类,并将其作为字符串集合保存在 Item 类中。有没有办法使用 JPA(休眠)注释来做到这一点?
我试图将@CollectionTable 与@JoinTable 结合起来,但它显然不起作用:
@Entity
public class Item {
@Id
private long id;
@ElementCollection
@JoinTable(name = "ITEM_LABEL", joinColumns = @JoinColumn(name = "ITEM_ID"))
@CollectionTable(name = "LABEL", joinColumns = @JoinColumn(name = "ID", referencedColumnName = "LABEL_ID"))
@Column(name = "TEXT")
private Collection<Strings> labels;
}
谁能告诉我如何将标签作为字符串集合包含在项目类中,好吗?非常感谢!
解决方案
@JoinTable
用于将以下关联映射到数据库表:双向多对一/一对多、单向多对一和一对一(双向和单向)关联。
如果你真的想拥有 Label
他自己的表,你必须将它定义为一个Entity
然后使用ManyToMany
关系。
另一种解决方案是删除Label
表并在表中保留标签名称LABEL
而不是 label_id item_label
。
所以你的关系会变成
@ElementCollection
@CollectionTable(name = "ITEM_LABEL", joinColumns = @JoinColumn(name = "ITEM_ID"))
@Column(name = "LABEL")
推荐阅读
- javascript - 使用 sinon 对从基类继承的受保护函数进行存根
- mediawiki - 更新 mediawiki 时 LightnCandy 未发现错误
- python - Flask 中的双花括号在包围函数时是什么意思?
- javascript - word office-js:使用 CustomXmlParts 或自定义设置获取文档
- sql - SQL 聚合到最多 3 个日期范围
- python-3.x - 如何使用模型当前 id 查询另一个模型
- java - 在字符串之前生成空间的最快方法
- python - 将时间序列导出到python中的excel
- sql - SQL 从多行的另一张表的余额中扣除一个表中的值
- r - 如何使用 ggplot 更改 x 轴