0 0

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

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

 

 


问题补充:在web.xml配置了这段以后filter以后是可以通过role得到trees了,但是Tree那边的list变成了好多重复的
<!-- Hibernate Open Session In View filter-->
<filter>
<filter-name>hibernateOpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hibernateOpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2013年8月11日 00:01

2个答案 按时间排序 按投票排序

0 0

采纳的答案

web中增加过滤器

	<filter>
		<filter-name>hibernateOpenSessionInViewFilter</filter-name>
		<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
	</filter>

2013年8月11日 08:27
0 0

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

2013年8月11日 12:46

相关推荐

    JPA一对一,一对多,多对多关系映射

    Java Persistence API(JPA)是Java平台上的一个标准,用于管理关系数据库中的对象持久化。它是ORM(对象关系映射)框架的一种实现,允许开发者使用Java对象来操作数据库,而无需编写大量的SQL代码。在JPA中,关系...

    13_jpa多对多双向关联实体定义与注解

    本篇将详细讲解JPA中的一个关键概念——多对多双向关联,并通过实体定义与注解设置来深入理解这一特性。"13_传智播客JPA详解"系列教程涵盖了JPA的诸多方面,而"13_传智播客JPA详解_JPA中的多对多双向关联实体定义与...

    JPA学习笔记-EJB-05JPA实体对象状态和实体对象的高级操作

    ### JPA实体对象状态 #### 一、实体对象的状态分类 在Java Persistence API (JPA) 中,实体对象的状态管理是实现数据持久化的基础之一。根据实体对象与实体管理器(EntityManager)之间的交互关系,实体对象可以...

    jpa的实体映射关系7种

    在单向多对多关系中,一个实体可以关联多个其他实体,而这些实体并不知道这个关联。使用`@ManyToMany`注解,关联表通常由JPA自动创建,除非自定义了`@JoinTable`。 7. **双向多对多**: 双向多对多是最复杂的关系...

    JPA一对多和多对一关系

    在JPA中,实体间的关系映射是核心概念之一,其中一对多(OneToMany)和多对一(ManyToOne)是两种常见的关系类型。 ### 一对多关系(OneToMany) 在数据库中,一对多关系意味着一个表中的记录可以与另一个表中的多...

    JPA中的多对多双向关联实体定义与注解设置

    在Java Persistence API (JPA) 中,多对多(ManyToMany)关系是表示两个实体之间复杂关联的一种方式。这种关联允许一个实体实例可以与多个其他实体实例相关联,反之亦然。例如,一个学生可以选修多门课程,一门课程...

    11_传智播客JPA详解_JPA中的一对多延迟加载与关系维护

    在Java世界中,Java Persistence API(JPA)是用于对象关系映射(ORM)的一种标准规范,它使得Java开发者能够以面向对象的方式处理数据库操作。本教程“11_传智播客JPA详解_JPA中的一对多延迟加载与关系维护”聚焦于...

    11_JPA详解_JPA中的一对多延迟加载与关系维护.zip

    在一对多关系中,通常一方是“父”实体,另一方是“子”实体。JPA提供了一种方式来方便地管理和维护这种关系,包括添加、删除子实体,以及在保存或更新父实体时自动同步子实体的状态。 **延迟加载** 延迟加载...

    JPA视频教程_使用jpa映射单个实体对象

    4. **关系映射(Relationship Mapping)**: JPA也支持处理对象之间的关系,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。例如,一个User可能有多个Order,可以这样映射...

    JPA多对多Demo

    对于多对多关系,我们需要在双方实体类中分别添加一个`@ManyToMany`注解的集合属性,表示另一方实体的集合。例如: ```java @Entity @Table(name = "teacher") public class Teacher { @Id @GeneratedValue...

    Hibernate annotation JPA 一对多,多对多

    在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它使得开发者可以使用面向对象的方式来操作数据库。JPA(Java Persistence API)是Java平台上的标准持久化框架,它定义了规范,而...

    JPA_2_一对多双向关联关系

    在JPA中,一对多关联关系是常见的实体间关系类型,它表示一个实体可以与多个其他实体相关联。例如,一个学生可以有多个课程,一个部门可以有多名员工。在这个场景中,我们将深入探讨如何在JPA 2中实现一对多双向关联...

    13_JPA详解_JPA中的多对多双向关联实体定义与注解设置.zip

    本资料“13_JPA详解_JPA中的多对多双向关联实体定义与注解设置”专注于讲解JPA如何处理多对多双向关联关系,这是数据库设计中常见的一种复杂关联类型。下面我们将详细探讨这一主题。 首先,我们需要理解多对多关联...

    jpa--9.单向多对一

    在Java Persistence API (JPA) 中,"单向多对一"关系是一种常见的对象关系映射(ORM)设计模式,用于表示实体之间的关联。在这个模式中,一个实体("多"端)可以引用另一个实体("一"端),但被引用的实体并不持有对...

    JPA常用关系实现例子

    Java Persistence API(JPA)是Java平台上的一个标准,用于管理关系数据库中的对象持久化。它是ORM(对象关系映射)框架的一种实现,允许开发者使用面向对象的方式处理数据,而无需过多关注底层的SQL语句。JPA通过...

    jpa 别名转实体

    别名转实体是JPA中的一个概念,它涉及到如何通过别名来查询数据库并映射到对应的实体类上。 在JPA中,我们经常需要处理SQL查询结果,这些结果可能包含别名,例如在HQL(Hibernate Query Language)或JPQL(Java ...

    14_传智播客JPA详解_JPA中的多对多双向关联的各项关系操作

    **JPA(Java Persistence API)**是Java平台上的一个标准,用于管理关系数据库中的数据,它简化了ORM(对象关系映射)的过程。在JPA中,多对多(Many-to-Many)关联是一种常见的关系类型,适用于描述两个实体之间...

    JPA一对一关系实例配置

    一对一关系在数据库设计中意味着两个实体之间存在一个实体对应另一个实体的唯一关系。例如,一个人可能只有一个护照,或者一个公司只有一份营业执照。在JPA中,我们可以通过注解来配置这种关系。 首先,我们需要在...

    JPA映射关系详解javax JPA JPA映射关系 JPA映射

    在这个例子中,`UserEmail` 实体与另一个实体通过 `USER_ID` 字段建立了关联。这意味着 `UserEmail` 对象仅能与一个具有唯一 `USER_ID` 的实体关联。 #### 2. OneToMany 关系建立 一对多关系表示一个实体可以与多...

    JPA实体关联(hibernate实现)

    它提供了一种面向对象的方式来操作数据,而Hibernate是JPA的一个流行实现。在JPA中,实体间的关联映射是核心概念之一,它们定义了对象之间的关系,使得在数据库中的数据可以被对象模型所表示。以下将详细解释四种...

Global site tag (gtag.js) - Google Analytics