0 0

Hibernate 4 双向@ManyToMany 执行查询功能自动删除中间表记录 5

Hibernate 3.6.5升级到4.10,遇见一个双向@ManyToMany的问题,在没有执行delete操作时,仅仅是执行查询功能,调用get()方法时,hibernate自动执行delete,删除相对应的中间表记录。
代码如下
User Class

   

@Entity
@Table(name="user")
public class User {
     @ManyToMany(fetch=FetchType.LAZY)
     @Cascade(value{CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH}) 
     @JoinTable(name="usersroles", joinColumns = {@JoinColumn(name ="usersroles_user" )}, 
      inverseJoinColumns = { @JoinColumn(name = "usersroles_role") }) 
     @JSON(serialize=false)
     public Set<Role> getRoles() {
    		return roles;
     }



Role Class
    

@Entity
@Table(name="role")
public class Role {  
     @ManyToMany(cascade{CascadeType.REFRESH},fetch=FetchType.LAZY,mappedBy="roles")
     @JSON(serialize=false)
     public Set<User> getUsers() {
          return users;
     }


查询方法

  

 public List<User> getUserAndRoleList() {
    	String jpql = "SELECT DISTINCT u FROM User u , Role r, UserRole ur  WHERE u.id = ur.u                        serId AND r.id = ur.roleId ORDER BY u.username";
    	QueryResult<User> qr = super.getDataWithOriginalJPQL(jpql);
    
    	userList = qr.getResultList();
    	return userList;
    }



当执行到一下代码:

   

userList = userService.getUserAndRoleList();
    		for(int i=0;i<userList.size();i++){
    			Iterator<Role> it = userList.get(i).getRoles().iterator();
    			Role role ;
    			}	
    		}


以上代码都可以正常工作,可以查询所想要结果,但是当执行完一下代码

   

userList.get(i).getRoles()


Hibernate 4.1  将会自动删除User和Role关系在usersroles表.
但是Hibernate 3.6.5 却不会,工作的很正常。
我没有执行任何删除操作,同样如果使用Gson对userList序列化,只要是调用userList.get(i).getRoles()方法就和删除usersroles表对应数据,请问这是怎么回事?有什么办法解决?

 

2013年3月28日 03:10
目前还没有答案

相关推荐

    hibernate5_ManyToMany多对多单向维护

    在`User`实体中,我们使用`@ManyToMany`注解来声明多对多关联,并通过`@JoinTable`注解指定中间表`user_roles`,以及两个实体在中间表中的对应列。 2. 定义`Role`实体: ```java @Entity public class Role { ...

    manytomany注解模式.rar

    2. **中间表**:默认情况下,Hibernate会自动生成一个中间表,但你可以通过`@JoinTable`指定自己的中间表名和连接字段。 3. **集合类型**:`@ManyToMany`通常与`Set`一起使用,因为多对多关系不允许重复的关联,而`...

    hibernate中manytomany的例子

    - Hibernate会自动维护中间表,但需要注意的是,如果直接操作数据库删除了一个实体,那么相关的关联可能不会自动更新。因此,推荐始终通过Hibernate API来管理关联关系,避免直接操作数据库。 5. 中间表的自定义:...

    hibernate对象三状态及OneToOne&OneToMany&ManyToMany

    本篇将详细阐述Hibernate中的对象三状态、一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 一、Hibernate对象三状态 1. 游离态(Detached):对象在应用程序中创建,但尚未与Session...

    springboot 1.5.2 jpa ManyToMany Demo

    在`jpa-test`文件中,可能包含了示例代码,用于演示如何创建、查询和管理ManyToMany关联的实体。你可以根据这个测试文件进一步了解实际操作中的细节。 总结起来,Spring Boot 1.5.2结合JPA处理ManyToMany关联时,...

    Hibernate多对多双向关联(annotation/xml)

    在Hibernate中,通过注解方式实现多对多双向关联,我们需要使用`@ManyToMany`注解,并配合`@JoinTable`来定义关联表。以下是一个简单的例子: 1. 定义两个实体类,比如`Student`和`Course`: ```java @Entity ...

    SpringBoot-SpringData-ManyToMany

    - `ManyToMany`关系需要一个中间表来存储双方实体的外键,Spring Data JPA会自动为我们创建这个表,但我们可以通过`@JoinTable`注解自定义它的名字、列名等。 3. **Repository接口**: - 创建继承自`Jpa...

    hibernate 多表关联 中间表

    在处理多表关联时,Hibernate提供了一种高效且灵活的方法,尤其是当涉及到中间表的情况。中间表通常用于实现多对多(Many-to-Many)的关系,比如在一个用户和角色的关系中,一个用户可以有多个角色,一个角色也可以...

    Hibernate ORM - 多对多双向连接表关联关系

    3. **中间表配置**:虽然大多数情况下Hibernate会自动创建中间表,但你也可以通过`@JoinTable`注解自定义中间表的细节,如表名、联合主键等。例如: ```java @ManyToMany @JoinTable(name = "student_course", ...

    manytomany关系

    总之,ManyToMany关系在Hibernate中用于处理两个实体类之间的多对多关联,通过中间表进行数据存储,并通过`@ManyToMany`注解在实体类中进行定义。理解并正确使用这种关系,对于开发复杂的业务系统至关重要。

    hibernate双向多对多关联映射(注解版)

    多对多关系通常需要一个中间表来存储两个实体的关联信息,但在Hibernate中,我们不需要手动创建这个中间表。`@JoinTable`注解可以用来定义中间表的详细信息,包括表名、连接字段等。 3. **关系的维护**: 在双向...

    Hibernate 两种方式映射many to many

    5. 中间表的维护通常由Hibernate自动处理,但在某些场景下,可能需要手动干预,如在插入数据时同步中间表。 通过以上两种方式,开发者可以根据项目需求和具体场景灵活地在Hibernate中映射多对多关系。理解和熟练...

    Hibernate 多表连接分页查询示范项目

    项目通过 Hibernate Criteria API 展示了如何进行多表连接查询,并结合分页功能,有效地获取和展示相关数据。项目源码会详细展示如何创建 Criteria 查询,如何设置 JOIN 条件,以及如何实现分页。 **具体步骤** 1....

    hibernate多对多查询

    总之,Hibernate的多对多查询涉及实体类的定义、中间表的映射以及查询语句的编写。理解和熟练运用这些概念对于开发复杂的Java应用程序至关重要。在实际项目中,应根据业务需求灵活调整关联策略,确保数据的一致性和...

    hibernate 双向多对多关联映射练习

    2. **中间表的自动创建**:Hibernate默认会根据`@ManyToMany`和`@JoinTable`的配置自动生成中间表,但也可以手动指定表结构。 3. **关联的管理**:在业务逻辑中,我们需要添加或删除关联。例如,当一个学生选修一门...

    hibernate 多对多源代码

    默认情况下,Hibernate会自动创建中间表,但我们可以通过`@JoinTable`来自定义中间表的结构,添加额外的列或者指定不同的表名。例如,可以添加一个表示选课时间的字段。 四、关联的维护 在多对多关系中,关联的维护...

    hibernate多对多双向关联

    **标题解析:**“hibernate多对多双向关联” 在Java编程中,Hibernate是一个流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作。"多对多双向关联"是Hibernate中一种关系映射类型,涉及两...

    JPA学习总结(四)--JPAManyToMany双向关联

    此外,由于`@ManyToMany`默认创建了一个中间表,所以在数据库设计时,可以根据业务需求考虑是否需要自定义中间表的结构,比如添加额外的属性,如关联的创建时间等。 总之,JPA的`@ManyToMany`注解为我们处理多对多...

    JPA课程manyToMany OneToMany 等全部测试

    在这个例子中,`Student`和`Course`类分别表示学生和课程,它们通过`@ManyToMany`建立关联,并通过`@JoinTable`定义了中间表`student_course`。 ### `@OneToMany`关系 `@OneToMany`注解表示一个实体可以与另一个...

    hibernate表之间3种双向关联映射

    在Hibernate中,这种关联通常通过中间表实现。双向意味着两个实体类都可以直接访问彼此的集合属性。配置时,我们需要在双方实体类中添加`@ManyToMany`注解,并通过`mappedBy`属性指定对方的集合属性名。 接着是双向...

Global site tag (gtag.js) - Google Analytics