Jpa方式多对多关系中实体对象间如何通过一个实体获取另一实体的对象

项目是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()...
}

 

 

2个回答

web中增加过滤器
[code="java"]

hibernateOpenSessionInViewFilter
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter

[/code]

udblnmhmy
henryzsf 原来是没加filter-mapping
6 年多之前 回复
udblnmhmy
henryzsf 不行呢,添加了这句还是没反应
6 年多之前 回复

sys_role_tree_menu的TREE_ID,ROLE_ID设置成复合主键试试。

udblnmhmy
henryzsf 已经解决!在TreePO中的roles属性加上fetch=FetchType.LAZY后trees列表就不会出现重复的问题了
6 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问