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的主要内容,如果未能解决你的问题,请参考以下文章

使用 JPA 和 Hibernate 提供程序的多对多关系不会创建主键

Spring boot JPA - 使用额外的列查询多对多

具有额外多对多关系的 JPA 多对多

JPA 多对多单向

多对多 Spring Boot JPA 未填充多对多表

JPA:多对多关系 - JsonMappingException:无限递归