我有一个基本的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
答案 0 :(得分:1)
包含 cascade =“所有” (如果使用xml)或 cascade = CascadeType.ALL (如果使用注释) 在您的收藏夹映射上。
因为您的实体中有一个集合,并且该集合具有数据库中不存在的一项或多项。使用以上选项,您告诉hibernate在保存其父级时将其保存到数据库中。
答案 1 :(得分:0)
在保存对象时,如果Hibernate认为需要保存与要保存的对象相关联的对象,则会发生这种情况。
在将角色保存到数据库之前,还要保存用户,这是错误的,因为休眠会话直到那个时间点才知道该对象。因此要消除此错误,请在映射上使用CascadeType.ALL
。