项目是ssh三大框架的,数据库是通过实体对象PO用注解的方式生成的。现在有两个PO实体,一个是角色,一个是菜单。他们之间是多对多关系,数据库会生成一张中间的关联表(仅包含ROEL_ID和TREE_ID),现在我想做权限分配,就是实现根据角色分配菜单的功能。在RoleAction这边想通过roleService.getRole(id).getTrees()的方式得到该角色下相应的菜单,但总是报如下错误:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: wteam.pojo.RolePO.trees, no session or session was closed
类RolePO和TreePO如下,Role是维护端,网上很多说多对多用懒加载的方式比较好,但是报错说session关闭了我又取不到结果。我如果换成急加载的方式,是能得到该RoleI下的Tree表了,但是查询Role表就出现问题了,记录会变成很多条,而且还是重复的。就是不知道哪里出了问题
public class RolePO implements Serializable{ @Entity @Table(name="sys_role") public class RolePO implements Serializable{ //角色PO private static final long serialVersionUID = -6889909565150942238L; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name = "ROLE_ID") private int roleId; //角色标识位 @Column(name = "NAME",unique = true,nullable = false) private String name; //角色名称 @Column(name = "DISCRIPTION") private String discription; //角色描述 @ManyToMany(targetEntity = TreePO.class, cascade = CascadeType.REFRESH) @JoinTable(name = "sys_role_tree_menu", joinColumns = { @JoinColumn(name = "ROLE_ID")}, inverseJoinColumns = { @JoinColumn(name = "TREE_ID") }) private List<TreePO> trees; //省略set、get方法 }
@Entity @Table(name="sys_tree_menu") public class TreePO implements Serializable{ private static final long serialVersionUID = -1549993655782216421L; //菜单PO @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name = "TREE_ID") private int treeId; //树形导航标识位 @Column(name = "NAME",unique = true,nullable = false) private String name; //名称 @ManyToMany(cascade = CascadeType.MERGE,mappedBy = "trees") private List<RolePO> roles; //省略其他属性、set()、get()... }