henryzsf
2013-08-11 00:01
浏览 402
已采纳

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条回答 默认 最新

  • Dead_Knight 2013-08-11 08:27
    已采纳

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

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

    [/code]

    已采纳该答案
    打赏 评论
  • zyn010101 2013-08-11 12:46

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

    打赏 评论

相关推荐 更多相似问题