【问题标题】:JPA - many-to-many as ElementCollectionJPA - 多对多作为 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,很遗憾我没有。我已经为标签创建了一个类

标签: java hibernate jpa orm many-to-many


【解决方案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 实体,但我仍在寻找更好的解决方案。如果我很快找不到它,我会将您的答案标记为已接受。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 2011-06-25
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多