Spring Boot 在SpringBoot 2.0.4应用程序中刷新之前保存 transient 示例

isr3a4wc  于 2022-11-05  发布在  Spring
关注(0)|答案(2)|浏览(119)

我有一个基本的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
6jjcrrmo

6jjcrrmo1#

在集合Map中包括cascade=“all”(如果使用xml)或cascade=CascadeType.ALL(如果使用注解)。
因为您的实体中有一个集合,而该集合中有一个或多个项目在数据库中不存在。使用上面的选项,您可以告诉Hibernate在保存它们的父项时将它们保存到数据库中。

qvtsj1bj

qvtsj1bj2#

当Hibernate认为它需要保存一个与您正在保存的对象相关联的对象时,在保存对象时会发生这种情况。
同样,在将角色保存到数据库之前,您保存的是错误的用户,因为Hibernate会话在该时间点之前不知道该对象。因此,要消除此错误,请在Map上使用CascadeType.ALL

相关问题