繁体   English   中英

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

[英]save the transient instance before flushing in SpringBoot 2.0.4 app

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM