hibernate - 在 SpringBoot 2.0.4 应用程序中刷新之前保存瞬态实例
问题描述
我有一个基本的 SpringBoot 2.0.4.RELEASE 应用程序。使用 Spring Initializer、JPA、嵌入式 Tomcat、Thymeleaf 模板引擎,并将其打包为可执行的 JAR 文件。
我有这个方法:
@Transactional
public User createUser(User user, Set<UserRole> userRoles) {
User localUser = userRepository.findByEmail(user.getEmail());
if (localUser != null) {
LOG.info("User with username {} and email {} already exist. Nothing will be done. ",
user.getUsername(), user.getEmail());
} else {
String encryptedPassword = passwordEncoder.encode(user.getPassword());
user.setPassword(encryptedPassword);
for (UserRole ur : userRoles) {
LOG.info("Saving role " + ur);
roleRepository.save(ur.getRole());
}
user.getUserRoles().addAll(userRoles);
localUser = userRepository.save(user);
}
return localUser;
}
但是当我创建一个用户时:
User user = new User();
Set<UserRole> userRoles = new HashSet<>();
userRoles.add(new UserRole(user, new Role(RolesEnum.ADMIN)));
userService.createUser(user, userRoles);
我收到了这个错误:
object references an unsaved transient instance - save the transient instance before flushing : com.tdk.backend.persistence.domain.backend.UserRole.role -> com.tdk.backend.persistence.domain.backend.Role
解决方案
在集合映射中包含 cascade="all"(如果使用 xml)或cascade=CascadeType.ALL(如果使用注释)。
因为您的实体中有一个集合,并且该集合具有数据库中不存在的一个或多个项目。使用上面的选项,你告诉休眠在保存它们的父级时将它们保存到数据库中。
推荐阅读
- node.js - Docker 容器在您的平台上为 Chrome 浏览器提供无二进制文件
- java - Android:我删除了一个包,然后我得到了 ClassNotFoundException:在路径上找不到类
- nestjs - nestjs extends jwt guard
- python - 以块的形式迭代一个 numpy 数组
- c - 无法使用中间人程序和文件描述符进行通信
- r - 使用 dplyr 改变一个新列,其值基于多个条件;尝试了 lapply 但仍然无法正常工作
- python - 比较 Pandas 中不同列对中的值
- python - Pyspark 分类数据矢量化,具有与之相关的数值
- sql - 测试 ARRAY 是否包含给定 ARRAY 的 ALL 或 NO 元素
- google-analytics - 如何更改谷歌分析中的网站网址路径?