首页 > 解决方案 > JPA - 多对多作为 ElementCollection

问题描述

我有一个多对多的关系,将标签(除了字符串)分配给项目:

+------+   +------------+   +-------+
| ITEM |   | ITEM_LABEL |   | LABEL |
|------|   |------------|   |-------|
|  ID  |<->|  ITEM_ID   | ┌&gt;|  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;
}

谁能告诉我如何将标签作为字符串集合包含在项目类中,好吗?非常感谢!

标签: javahibernatejpaormmany-to-many

解决方案


@JoinTable用于将以下关联映射到数据库表:双向多对一/一对多、单向多对一和一对一(双向和单向)关联。

如果你真的想拥有 Label他自己的表,你必须将它定义为一个Entity然后使用ManyToMany关系。

另一种解决方案是删除Label表并在表中保留标签名称LABEL而不是 label_id item_label

所以你的关系会变成

@ElementCollection
@CollectionTable(name = "ITEM_LABEL", joinColumns = @JoinColumn(name = "ITEM_ID"))
@Column(name = "LABEL")

推荐阅读