JPA-多对多AS ElementCollection

2022-02-27 00:00:00 many-to-many orm java Hibernate jpa

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

+------+   +------------+   +-------+
| ITEM |   | ITEM_LABEL |   | LABEL |
|------|   |------------|   |-------|
|  ID  |<->|  ITEM_ID   | ┌>|  ID   |
|------|   |------------| | |-------|
| .... |   |  LABEL_ID  |<┘ | TEXT  |
+------+   +------------+   +-------+

..。我希望避免为Label表创建POJO类,而将其作为字符串集合保留在Item类中。有没有使用JPA(Hibernate)注释的方法?

我尝试将@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;
}

有人能告诉我如何将标签作为字符串集合包括在Item类中吗?非常感谢!


解决方案

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

如果确实要将Label与他自己的表一起使用,则必须将其定义为Entity,然后使用ManyToMany关系。

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

因此您的关系将变为

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

相关文章