Java 在集合中休眠集合
我有一个名为Menu的Hibernate实体,它有一个组集合,每个组依次有一个MenuItems集合。例如,菜单可以是餐厅的,团体可以是午餐和晚餐,菜单中的菜单可以是意大利面、汉堡、沙拉 我遇到的问题是,一旦我创建了菜单并保存了它(效果很好),当我试图取回菜单时,我得到的组比最初创建的多。以上面的例子为例,如果我把汉堡和沙拉放在晚餐组中,而把意大利面放在午餐组中,我会得到一份包含三组(而不是两组)的菜单:两组晚餐组(每个都有我放进去的食物)和一组午餐。我基本上得到的是我插入到每个组中的菜单项的数量。因此,如果我插入了4个项目,将返回4个组。有人知道为什么会这样吗 这些关系是:菜单到组=一对多,组到菜单项=多对多 组不会被重用。他们将是唯一的一个菜单。但是菜单项可以在许多组中重复使用 这是我的密码:Java 在集合中休眠集合,java,hibernate,collections,jpa,many-to-many,Java,Hibernate,Collections,Jpa,Many To Many,我有一个名为Menu的Hibernate实体,它有一个组集合,每个组依次有一个MenuItems集合。例如,菜单可以是餐厅的,团体可以是午餐和晚餐,菜单中的菜单可以是意大利面、汉堡、沙拉 我遇到的问题是,一旦我创建了菜单并保存了它(效果很好),当我试图取回菜单时,我得到的组比最初创建的多。以上面的例子为例,如果我把汉堡和沙拉放在晚餐组中,而把意大利面放在午餐组中,我会得到一份包含三组(而不是两组)的菜单:两组晚餐组(每个都有我放进去的食物)和一组午餐。我基本上得到的是我插入到每个组中的菜单项的数
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;
}
类菜单{
@Id@GeneratedValue(策略=GenerationType.AUTO)
私人长菜单;
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@JoinColumn(name=“menuID”)
私人名单组;
}
类菜单组{
@Id@GeneratedValue(策略=GenerationType.AUTO)
私有长groupID;
@排序(type=SortType.NATURAL)
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name=“组菜单项”,
joinColumns={@JoinColumn(name=“groupID”)},
inverseJoinColumns={@JoinColumn(name=“menuItemID”)})
私有分类集菜单项;
}
类菜单项{
@Id@GeneratedValue(策略=GenerationType.AUTO)
私人长菜单项;
}
对不起,我不能评论atm,所以它必须是一个答案。请指定如何在java映射文件中检索数据+,您可以使用枚举类型!指定午餐/晚餐,并获取关系。但请提供更多关于如何检索数据以及映射文件的信息 对不起,我不能评论atm,所以它必须是一个答案。请指定如何在java映射文件中检索数据+,您可以使用枚举类型!指定午餐/晚餐,并获取关系。但请提供更多关于如何检索数据以及映射文件的信息 @Hisham你能告诉我你是如何检索你保存的菜单的吗???@Arthur:谢谢你的评论。我使用的是Spring,所以我使用HibernateTemplate的方式如下:template.get(Menu.class,menuID);您是否正确地实现了hashCode/equals?@Pascal:我将在哪里实现它?你的意思是为了分类集?我已经在MenuItem上实现了Comparable,我将返回并修补它,以确保这不是问题所在。但是那里可能有什么问题?看。但我认为这不是问题所在(不过您应该为MenuItem提供有效的实现)。事实上,一个允许复制的测试用例真的很好。@Hisham你能告诉我如何检索你保存的菜单吗?@Arthur:谢谢你的评论。我使用的是Spring,所以我使用HibernateTemplate的方式如下:template.get(Menu.class,menuID);您是否正确地实现了hashCode/equals?@Pascal:我将在哪里实现它?你的意思是为了分类集?我已经在MenuItem上实现了Comparable,我将返回并修补它,以确保这不是问题所在。但是那里可能有什么问题?看。但我认为这不是问题所在(不过您应该为MenuItem提供有效的实现)。实际上,一个允许复制的测试用例会非常好。