【问题标题】:Hibernate collections within collections集合内的休眠集合
【发布时间】:2011-03-26 13:27:00
【问题描述】:

我有一个名为 Menu 的 Hibernate 实体,它有一个 Groups 集合,每个组又都有一个 MenuItems 集合。例如,菜单可以是餐厅,组可以是午餐和晚餐,其中的菜单项可以是意大利面、汉堡、沙拉。

我遇到的问题是,一旦我创建了菜单并保存了它(效果很好),当我尝试取回菜单时,我得到的组比最初创建的组多。所以以上面的例子为例,如果我把汉堡和沙拉放在晚餐组,意大利面放在午餐,我会返回一个包含三个(而不是两个)组的菜单:2 个晚餐组(每个都有我放入的项目)和 1 个午餐组.我基本上得到了尽可能多的组作为我插入每个组的菜单项的数量。因此,如果我插入了 4 个项目,则返回 4 个组。有人知道为什么会这样吗?

关系是:菜单到组 = 一对多,组到 MenuItems = 多对多

组不会重复使用。它们将是一个菜单所独有的。但是 MenuItem 可以在许多组中重复使用。

这是我的代码:

class Menu {
   @Id @GeneratedValue(strategy = GenerationType.AUTO)
   private long menuID;

   @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)     
   @JoinColumn(name="menuID")
   private List<MenuGroup> groups;
}

class MenuGroup {
   @Id @GeneratedValue(strategy = GenerationType.AUTO)
   private long groupID;

   @Sort (type=SortType.NATURAL)
   @ManyToMany(fetch=FetchType.EAGER)
   @JoinTable(name="group_menu_item", 
              joinColumns = { @JoinColumn(name = "groupID") }, 
              inverseJoinColumns = { @JoinColumn(name = "menuItemID") } )
   private SortedSet<MenuItem> menuItems;
}

class MenuItem {
   @Id @GeneratedValue(strategy = GenerationType.AUTO)
   private long menuItemID;
}

【问题讨论】:

  • @Hisham 你能展示你如何找回你保存的菜单吗???
  • @Arthur:感谢您的评论。我正在使用 Spring,所以我通过以下方式使用 HibernateTemplate:template.get(Menu.class, menuID);
  • 你是否正确实现了 hashCode/equals?
  • @Pascal:我会在哪里做呢?你是说 SortedSet 吗?我已经在 MenuItem 上实现了 Comparable,我会回去修改它以确保这不是问题。但那里可能有什么问题?
  • 4.3. Implementing equals() and hashCode()。但我认为这不是问题所在(尽管您应该为 MenuItem 提供有效的实现)。实际上,允许重现的测试用例会非常好。

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


【解决方案1】:

抱歉无法评论atm,所以它必须是一个答案。请指定您如何检索数据 + 在您可以使用枚举类型的 java 映射文件中!指定午餐/晚餐,并获取关系。但请提供有关如何检索获取数据以及映射文件的更多信息!

【讨论】:

    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2013-03-20
    • 2011-02-03
    • 2017-01-03
    • 1970-01-01
    相关资源
    最近更新 更多