Mysql 如何将导航下拉菜单表示为Java对象(对于JPA)

Mysql 如何将导航下拉菜单表示为Java对象(对于JPA),mysql,object,jpa,menu,navigation,Mysql,Object,Jpa,Menu,Navigation,是否有任何常规的方法来处理这个问题,即必须将web站点的下拉导航菜单作为Java对象呈现,以便JPA与DB一起工作 我使用MySQL DB、Hibernate和JPA实现持久性 实际的问题是,在DB中表示菜单最方便的方式是什么。或者为了这个目的我需要避开物体 “下拉”表示菜单项可能有无限(或至少很少)子项(子菜单) 我从一个简单的菜单项DB表开始,该表由id、菜单项文本、url和父id组成,但我不知道如何前进。菜单和子菜单的关系非常类似于EmployeeManager关联,在该关联中,员工向经理

是否有任何常规的方法来处理这个问题,即必须将web站点的下拉导航菜单作为Java对象呈现,以便JPA与DB一起工作

我使用MySQL DB、Hibernate和JPA实现持久性

实际的问题是,在DB中表示菜单最方便的方式是什么。或者为了这个目的我需要避开物体

“下拉”表示菜单项可能有无限(或至少很少)子项(子菜单)


我从一个简单的菜单项DB表开始,该表由id、菜单项文本、url和父id组成,但我不知道如何前进。

菜单和子菜单的关系非常类似于EmployeeManager关联,在该关联中,员工向经理报告,经理可以拥有许多员工。这是双向的@manytone和@OneToMany关系

见下面的示例:

@Entity
public class Menu {

    private int id;
    private String text;
    private String url;

    @ManyToOne
    @JoinColumn(name="parent_menu_id")
    private Menu parent;

    @OneToMany(mappedBy="parent")
    private List<Menu> submenus;
}

JPA将如何填充父菜单和子菜单?我应该如何引用父id列?我更新了答案,以显示数据将如何填充到DB中。要指定父id列,可以使用@JoinColumn注释。给定一个子菜单,您应该能够使用submenu.getParent().getId()检索父id;它看起来并不复杂,但实际情况是它对我不起作用:-/我必须添加FetchType.eagent到@OneToMany,因为没有会话存在。然后创建对象,但是父菜单和子菜单为空,因为我还没有添加JOIN_列。在我添加了它的名称(这是正确的)之后,整个“menu”对象突然变为null。没有错误日志。不太确定您遇到的问题。如果您可以发布整个实体类以及用于检索/保存实体的代码,可能会有所帮助。我发现了问题所在。“父id”列中的值无效。如果项没有父项,则应该为NULL而不是0。现在它工作得很好。非常感谢。
[id:1, text:File, URL:/file.htm, parent_menu_id:null]
[id:2, text:Edit, URL:/edit.htm, parent_menu_id:null]
[id:3, text:New, URL:/new.htm, parent_menu_id:1]
[id:4, text:Open, URL:/open.htm, parent_menu_id:1]
[id:5, text:Save, URL:/save.htm, parent_menu_id:1]
[id:6, text:Cut, URL:/cut.htm, parent_menu_id:2]
[id:7, text:Copy, URL:/copy.htm, parent_menu_id:2]
[id:8, text:Paste, URL:/paste.htm, parent_menu_id:2]