【问题标题】:Persist existing entities more than once (duplicate key) for @OneToMany entity为@OneToMany 实体多次保留现有实体(重复键)
【发布时间】:2020-09-25 13:48:12
【问题描述】:

我有一个实体Pack,它应该包含一个MenuItem 实体对象的List,并且每个MenuItem 对象应该可以持久化到多个Pack

编辑

我在Pack实体中使用了@ManyToMany注解:

   public class Pack {
   ...

   @ManyToMany(mappedBy = "packs")
    private List<MenuItem> menuItems;
  }

MenuItem 实体中:

public class MenuItem{
 ...

@ManyToMany
@JoinTable(
        name = "pack_menu_items",
        joinColumns = { @JoinColumn(name = "menu_item_id") },
        inverseJoinColumns = { @JoinColumn(name = "pack_id") }
)
private List<Pack> packs;
}

这样,Postgres 数据库中就会生成一个名为pack_menu_items 的表。

现在我尝试创建一个新的Pack 对象并同时影响它一个MenuItem 列表,但这不起作用: post request: Pack with menuItems (image)

我尝试将menuItems 分别添加到Pack

@Override
public Pack addItems(int id, List<MenuItem> menuItems) {
    Pack pack = get(id);
    assert pack != null;
    List<MenuItem> menuItemsWillUpdate = pack.getMenuItems();
    menuItemsWillUpdate.addAll(menuItems);
    pack.setMenuItems(menuItemsWillUpdate);
    return repository.save(pack);
}

但在新表 pack_menu_items 中插入行却没有运气;

请问有什么帮助吗?

【问题讨论】:

    标签: postgresql spring-boot spring-data-jpa spring-rest


    【解决方案1】:

    如果Pack 可以包含多个MenuItems,而MenuItem 可以属于多个Packs,这实际上不是OneToMany,而是ManyToMany-关系。

    它们有一个不同的注释,@ManyToMany。要了解有关此内容的更多信息,我建议关注该主题的 this 教程。

    【讨论】:

    • 感谢您的回答。但我有一个问题,上面提到的教程适用于HashSet 对象而不是List 对象,我以前看过很多@ManyToMany,这是否相关或有意义?
    • 我不知道具体原因(我倾向于避免使用 ManyToMany 并使用我自己管理的专用连接实体),但经过一番搜索后,我了解到显然使用 Set 而不是一个 List 允许 Hibernate 更多地优化删除语句(可以在 this blogpost 中看到)。
    • 好吧,我使用了List,但我遇到了删除问题,所以我不得不手动操作。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2011-08-27
    • 1970-01-01
    • 2017-05-11
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多