在SpringBoot 2.0.4应用程序中刷新之前保存临时实例

时间:2018-08-25 18:16:33

标签: hibernate spring-mvc spring-boot spring-data-jpa spring-data

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

2 个答案:

答案 0 :(得分:1)

包含 cascade =“所有” (如果使用xml)或 cascade = CascadeType.ALL (如果使用注释) 在您的收藏夹映射上。

因为您的实体中有一个集合,并且该集合具有数据库中不存在的一项或多项。使用以上选项,您告诉hibernate在保存其父级时将其保存到数据库中。

答案 1 :(得分:0)

在保存对象时,如果Hibernate认为需要保存与要保存的对象相关联的对象,则会发生这种情况。

在将角色保存到数据库之前,还要保存用户,这是错误的,因为休眠会话直到那个时间点才知道该对象。因此要消除此错误,请在映射上使用CascadeType.ALL