先把代码贴上来
public void grantPrograms(Long roleId, Long[] programIds){
Role role = get(roleId);
Set<Program> programs = role.getPrograms();
//第一趟遍历, 删除未被选中的节目
for(Iterator<Program> it = programs.iterator(); it.hasNext(); ){
Program program = it.next();
if( !ArrayUtils.contains(programIds, program.getId()) ){
program.getRoles().remove(role);
it.remove(); //开始用programs.remove(program);抛java.util.ConcurrentModificationException
}
}
//第二趟遍历 插入新选中的节目
for(Long selectProgramId : programIds){
if(isNewSelected(programs, selectProgramId)){
Program p = get(Program.class, selectProgramId);
p.getRoles().add(role); //添加角色到节目的关联
programs.add(p);
}
}
save(role);
}
private boolean isNewSelected(Set<Program> programs, Long selecteId){
for(Program program : programs)
if(program.getId() == selecteId)return false;
return true;
}
可分为三步走
1.删除中间表中的关联,如果包含在被选中集合中 则忽略
2.插入新选择的关系到中间表 如果已经存在 则忽略
3.保存
ps:上面的代码只是对中间表数据产生影响 不会更新两边表的数据
分享到:
相关推荐
`org.hibernate.persister.collection.AbstractCollectionPersister`和`org.hibernate.action.internal.CollectionRemoveAction`等类是处理多对多关联删除的关键。通过阅读源码,我们可以了解到Hibernate如何处理...
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系模型,它用于处理两个实体类之间存在多个对应关系的情况。这篇博客"hibernate多对多关联映射(单项关联)"深入探讨了如何在Hibernate中实现这种映射...
在实际应用中,添加、删除和查询多对多关系的操作可以通过Hibernate提供的API轻松完成。例如,添加一个用户的角色: ```java User user = new User(); Role role = new Role(); // 假设已经设置了user和role的相关...
在Hibernate中,实现多对多映射通常需要通过中间表来完成,这个中间表包含两个外键,分别引用两个参与关系的实体。以下是实现多对多映射的步骤: 1. **定义实体类**:首先,我们需要为相关的两个实体创建Java类,...
在JavaEE应用中,多对多关系通常通过中间表(或称为关联表)来实现,该表包含两个实体的主键作为外键。让我们深入了解一下这个简单的Hibernate多对多示例。 首先,我们需要定义两个实体类,例如`Student`和`Course`...
`@ManyToMany`注解声明了多对多关系,`@JoinTable`定义了中间表及其关联字段。`mappedBy`属性表示反向关联,即Student类中的courses属性是Course类中的students属性的反向关联。 ### 知识点拓展 - **CascadeType**...
本教程主要聚焦于Hibernate中的一个复杂关系类型——双向多对多关系。 双向多对多关系是两个实体类之间的一种关联,每个实体都可以拥有多个实例,同时每个实例也可以关联到多个其他实体。这种关系在现实生活中很...
这样,Hibernate知道如何通过`student_course`中间表来处理多对多关系。 在`Course`类中,我们也同样使用`@ManyToMany`注解,但是这次我们需要明确地定义中间表`student_course`,通过`@JoinTable`注解指定连接列`...
本主题将深入探讨使用Hibernate进行多对多双向关联的实现,既可以通过注解(Annotation)方式,也可以通过XML配置文件来完成。 首先,我们来看多对多关联的基本概念。在数据库设计中,当两个实体之间存在多个实例...
3. **多对多(Many-to-Many)**:用于表示两个实体集合之间的多对多关联关系,这种关系通常需要通过一个中间表来实现。 #### Hibernate核心组件及工作流程 Hibernate的核心组件包括SessionFactory、Session、...
本文将详细介绍Hibernate中的关系映射机制,包括一对一、一对多、多对一以及多对多等不同类型的映射方式,并探讨其背后的原理及最佳实践。 #### 二、Hibernate关系映射基础 ##### 2.1 映射文件简介 在Hibernate中...
- `@ManyToMany`:多对多关联,两个实体类之间存在多对多的关系,通常需要一个中间表来维护关系。 5. **懒加载和级联操作注解** - `@LazyCollection(LazyCollectionOption.EXTRA)`:用于实现懒加载,只有在真正...
13. **多对多(Many-to-Many)关系映射**:这种关系需要一个中间表来存储两个实体类的关联,使用`@ManyToMany`注解并指定关联的表和属性。 14. **懒加载(Lazy Loading)与立即加载(Eager Loading)**:懒加载策略...
7. **一对多、多对一、一对一关系映射** - 通过 @OneToMany、@ManyToOne 和 @OneToOne 注解定义不同类型的关联关系,包括 cascade(级联操作)和 fetch(加载策略)属性。 8. **集合映射** - Hibernate 支持 List...
ORM框架如Hibernate,消除了手动编写SQL语句的需要,通过提供一个中间层来处理数据交互,使开发者可以专注于业务逻辑而不是底层数据库操作。 ### Hibernate 3.1 主要特点 1. **注解支持**:在Hibernate 3.1中,除了...
### 五、Hibernate的一对多和多对多关系配置 1. **一对一(OneToOne)**:一个实体对应另一个实体的一个实例。通过`@OneToOne`注解实现,可以通过`@JoinColumn`指定关联字段。 2. **一对多(OneToMany)**:一个...
在Hibernate中,多对多关系是一种常见的数据库表之间的关联类型,例如用户和角色的关系,一个用户可以有多个角色,一个角色也可以被多个用户拥有。实现这种关系通常涉及到第三方关联表,即一个用来存储两个实体关系...
- **多对多关联**:@ManyToMany的实现,包括中间表的管理。 **5. 集合映射** - **List、Set、Map**:理解这些集合类型在Hibernate中的映射,以及它们的区别。 - **懒加载与立即加载**:了解如何配置集合的加载策略...
总结,Hibernate中的多对多关系映射是通过`<many-to-many>`元素实现的,通过中间表完成两个实体间的关联。在实际开发中,理解并熟练掌握多对多关系的配置和操作,能够极大地提高开发效率,降低数据管理的复杂性。在...