Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在集合中休眠集合_Java_Hibernate_Collections_Jpa_Many To Many - Fatal编程技术网

Java 在集合中休眠集合

Java 在集合中休眠集合,java,hibernate,collections,jpa,many-to-many,Java,Hibernate,Collections,Jpa,Many To Many,我有一个名为Menu的Hibernate实体,它有一个组集合,每个组依次有一个MenuItems集合。例如,菜单可以是餐厅的,团体可以是午餐和晚餐,菜单中的菜单可以是意大利面、汉堡、沙拉 我遇到的问题是,一旦我创建了菜单并保存了它(效果很好),当我试图取回菜单时,我得到的组比最初创建的多。以上面的例子为例,如果我把汉堡和沙拉放在晚餐组中,而把意大利面放在午餐组中,我会得到一份包含三组(而不是两组)的菜单:两组晚餐组(每个都有我放进去的食物)和一组午餐。我基本上得到的是我插入到每个组中的菜单项的数

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

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

这些关系是:菜单到组=一对多,组到菜单项=多对多

组不会被重用。他们将是唯一的一个菜单。但是菜单项可以在许多组中重复使用

这是我的密码:

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提供有效的实现)。实际上,一个允许复制的测试用例会非常好。