【发布时间】: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