[英]save the transient instance before flushing in SpringBoot 2.0.4 app
我有一个基本的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 (如果使用注释)。
因为您的实体中有一个集合,并且该集合具有数据库中不存在的一项或多项。 使用以上选项,您告诉hibernate在保存其父级时将其保存到数据库。
当Hibernate认为需要保存与要保存的对象关联的对象时,在保存对象时会发生这种情况。
同样,在将角色保存到数据库之前,您正在保存用户,这是错误的,因为休眠会话直到该时间点才知道该对象。因此要消除此错误,请在映射上使用CascadeType.ALL
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.