我有一个基本的SpringBoot 2.0.4.RELEASE应用程序,使用Spring初始化程序、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
2条答案
按热度按时间6jjcrrmo1#
在集合Map中包括cascade=“all”(如果使用xml)或cascade=CascadeType.ALL(如果使用注解)。
因为您的实体中有一个集合,而该集合中有一个或多个项目在数据库中不存在。使用上面的选项,您可以告诉Hibernate在保存它们的父项时将它们保存到数据库中。
qvtsj1bj2#
当Hibernate认为它需要保存一个与您正在保存的对象相关联的对象时,在保存对象时会发生这种情况。
同样,在将角色保存到数据库之前,您保存的是错误的用户,因为Hibernate会话在该时间点之前不知道该对象。因此,要消除此错误,请在Map上使用
CascadeType.ALL
。