JPA - 多对多作为 ElementCollection
Posted
技术标签:
【中文标题】JPA - 多对多作为 ElementCollection【英文标题】:JPA - many-to-many as ElementCollection 【发布时间】:2020-04-21 06:39:27 【问题描述】:我有一个多对多关系,将标签(除了字符串)分配给项目:
+------+ +------------+ +-------+
| 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;
谁能告诉我如何将标签作为字符串集合包含在项目类中,好吗?非常感谢!
【问题讨论】:
我假设你找到了this other question,但它对你不起作用 您可能不需要@JoinTable
和@Column
注释
嗨 Lino。你提到的线程不处理多对多关系,所以它不能解决我的问题。还是谢谢!
您找到解决方案了吗?我遇到同样的问题。提前致谢
@Julien,很遗憾我没有。我已经为标签创建了一个类
【参考方案1】:
@JoinTable
用于将以下关联映射到数据库表:双向多对一/一对多、单向多对一和一对一(双向和单向)关联。
如果你真的想让Label
拥有他自己的表,你必须将它定义为Entity
,然后使用ManyToMany
关系。
另一种解决方案是删除Label
表并将标签名称保留为LABEL
,而不是item_label
表中的label_id。
所以你们的关系会变成
@ElementCollection
@CollectionTable(name = "ITEM_LABEL", joinColumns = @JoinColumn(name = "ITEM_ID"))
@Column(name = "LABEL")
【讨论】:
感谢您的回答,CodeScale。这是一个遗留数据库,我无法更改结构。此外,将标签放在自己的表格中还有一些好处/原因。我目前确实有一个 Label 实体,但我仍在寻找更好的解决方案。如果我很快找不到它,我会将您的答案标记为已接受。再次感谢!以上是关于JPA - 多对多作为 ElementCollection的主要内容,如果未能解决你的问题,请参考以下文章