首页 > 解决方案 > 在 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

标签: hibernatespring-mvcspring-bootspring-data-jpaspring-data

解决方案


在集合映射中包含 cascade="all"(如果使用 xml)或cascade=CascadeType.ALL(如果使用注释)。

因为您的实体中有一个集合,并且该集合具有数据库中不存在的一个或多个项目。使用上面的选项,你告诉休眠在保存它们的父级时将它们保存到数据库中。


推荐阅读