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表对应数据,请问这是怎么回事?有什么办法解决?
相关推荐
在`User`实体中,我们使用`@ManyToMany`注解来声明多对多关联,并通过`@JoinTable`注解指定中间表`user_roles`,以及两个实体在中间表中的对应列。 2. 定义`Role`实体: ```java @Entity public class Role { ...
2. **中间表**:默认情况下,Hibernate会自动生成一个中间表,但你可以通过`@JoinTable`指定自己的中间表名和连接字段。 3. **集合类型**:`@ManyToMany`通常与`Set`一起使用,因为多对多关系不允许重复的关联,而`...
- Hibernate会自动维护中间表,但需要注意的是,如果直接操作数据库删除了一个实体,那么相关的关联可能不会自动更新。因此,推荐始终通过Hibernate API来管理关联关系,避免直接操作数据库。 5. 中间表的自定义:...
本篇将详细阐述Hibernate中的对象三状态、一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 一、Hibernate对象三状态 1. 游离态(Detached):对象在应用程序中创建,但尚未与Session...
在`jpa-test`文件中,可能包含了示例代码,用于演示如何创建、查询和管理ManyToMany关联的实体。你可以根据这个测试文件进一步了解实际操作中的细节。 总结起来,Spring Boot 1.5.2结合JPA处理ManyToMany关联时,...
在Hibernate中,通过注解方式实现多对多双向关联,我们需要使用`@ManyToMany`注解,并配合`@JoinTable`来定义关联表。以下是一个简单的例子: 1. 定义两个实体类,比如`Student`和`Course`: ```java @Entity ...
- `ManyToMany`关系需要一个中间表来存储双方实体的外键,Spring Data JPA会自动为我们创建这个表,但我们可以通过`@JoinTable`注解自定义它的名字、列名等。 3. **Repository接口**: - 创建继承自`Jpa...
在处理多表关联时,Hibernate提供了一种高效且灵活的方法,尤其是当涉及到中间表的情况。中间表通常用于实现多对多(Many-to-Many)的关系,比如在一个用户和角色的关系中,一个用户可以有多个角色,一个角色也可以...
3. **中间表配置**:虽然大多数情况下Hibernate会自动创建中间表,但你也可以通过`@JoinTable`注解自定义中间表的细节,如表名、联合主键等。例如: ```java @ManyToMany @JoinTable(name = "student_course", ...
总之,ManyToMany关系在Hibernate中用于处理两个实体类之间的多对多关联,通过中间表进行数据存储,并通过`@ManyToMany`注解在实体类中进行定义。理解并正确使用这种关系,对于开发复杂的业务系统至关重要。
多对多关系通常需要一个中间表来存储两个实体的关联信息,但在Hibernate中,我们不需要手动创建这个中间表。`@JoinTable`注解可以用来定义中间表的详细信息,包括表名、连接字段等。 3. **关系的维护**: 在双向...
5. 中间表的维护通常由Hibernate自动处理,但在某些场景下,可能需要手动干预,如在插入数据时同步中间表。 通过以上两种方式,开发者可以根据项目需求和具体场景灵活地在Hibernate中映射多对多关系。理解和熟练...
项目通过 Hibernate Criteria API 展示了如何进行多表连接查询,并结合分页功能,有效地获取和展示相关数据。项目源码会详细展示如何创建 Criteria 查询,如何设置 JOIN 条件,以及如何实现分页。 **具体步骤** 1....
总之,Hibernate的多对多查询涉及实体类的定义、中间表的映射以及查询语句的编写。理解和熟练运用这些概念对于开发复杂的Java应用程序至关重要。在实际项目中,应根据业务需求灵活调整关联策略,确保数据的一致性和...
2. **中间表的自动创建**:Hibernate默认会根据`@ManyToMany`和`@JoinTable`的配置自动生成中间表,但也可以手动指定表结构。 3. **关联的管理**:在业务逻辑中,我们需要添加或删除关联。例如,当一个学生选修一门...
默认情况下,Hibernate会自动创建中间表,但我们可以通过`@JoinTable`来自定义中间表的结构,添加额外的列或者指定不同的表名。例如,可以添加一个表示选课时间的字段。 四、关联的维护 在多对多关系中,关联的维护...
**标题解析:**“hibernate多对多双向关联” 在Java编程中,Hibernate是一个流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作。"多对多双向关联"是Hibernate中一种关系映射类型,涉及两...
此外,由于`@ManyToMany`默认创建了一个中间表,所以在数据库设计时,可以根据业务需求考虑是否需要自定义中间表的结构,比如添加额外的属性,如关联的创建时间等。 总之,JPA的`@ManyToMany`注解为我们处理多对多...
在这个例子中,`Student`和`Course`类分别表示学生和课程,它们通过`@ManyToMany`建立关联,并通过`@JoinTable`定义了中间表`student_course`。 ### `@OneToMany`关系 `@OneToMany`注解表示一个实体可以与另一个...
在Hibernate中,这种关联通常通过中间表实现。双向意味着两个实体类都可以直接访问彼此的集合属性。配置时,我们需要在双方实体类中添加`@ManyToMany`注解,并通过`mappedBy`属性指定对方的集合属性名。 接着是双向...