Hibernate多对多关联场景下新增GROUPS记录并同步写入USER_GROUP中间表的方法

该需求完全可以通过Hibernate ORM实现,具体操作如下:
前置准备:实体类映射配置
首先要确保User和Group实体的多对多关联配置正确,示例配置如下:
User实体类示例
@Entity @Table(name = "USERS") public class User { @Id @Column(name = "userid") private Long userId; // 其他属性:用户名、密码等 // mappedBy表示关联关系由Group实体的users属性维护 @ManyToMany(mappedBy = "users") private List<Group> groups = new ArrayList<>(); // 省略getter、setter }
Group实体类示例
@Entity @Table(name = "GROUPS") public class Group { @Id @Column(name = "groupid") private Long groupId; // 其他属性:组名、组描述等 // 配置多对多关联,指定中间表和关联字段 @ManyToMany @JoinTable( name = "USER_GROUP", // 中间表名 joinColumns = @JoinColumn(name = "groupid"), // 当前实体在中间表的关联字段 inverseJoinColumns = @JoinColumn(name = "userid") // 关联实体在中间表的关联字段 ) private List<User> users = new ArrayList<>(); // 省略getter、setter }
具体操作步骤
- 第一步:通过UserRepository查询出userId为14的已存在用户实体
- 第二步:构造新的Group对象,设置groupId为10以及其他必填字段
- 第三步:把查询到的User对象加入到Group的users集合中
- 第四步:调用GroupRepository的
save()方法保存Group对象
完成上述操作后,Hibernate会自动执行两个SQL操作:先向GROUPS表插入groupid=10的记录,再向USER_GROUP表插入userid=14、groupid=10的关联记录,不需要手动操作中间表。
业务代码示例
@Service public class GroupService { @Autowired private UserRepository userRepository; @Autowired private GroupRepository groupRepository; @Transactional public Group addGroupWithUser(Long groupId, Long userId) { // 查询已存在的用户 User existUser = userRepository.findById(userId).orElseThrow(() -> new RuntimeException("用户不存在")); // 构造新的分组 Group newGroup = new Group(); newGroup.setGroupId(groupId); // 其他字段赋值,比如groupName等 // 关联用户 newGroup.getUsers().add(existUser); // 保存分组 return groupRepository.save(newGroup); } }
注意事项
- 必须加上
@Transactional注解保证操作的原子性 - 不要给
@ManyToMany配置多余的CascadeType.PERSIST或CascadeType.ALL,否则可能会尝试重复插入已存在的User实体,触发主键冲突错误 - 如果你的实体配置中是由User端维护关联关系,只需要反过来操作:把新构造的Group加入到User的groups集合中,再调用userRepository的save方法即可,效果一致
内容的提问来源于stack exchange,提问作者Kartik Tushir
相关产品推荐
相关产品推荐

