сохраните временный экземпляр перед сбросом в приложении SpringBoot 2.0.4 - PullRequest
0 голосов
/ 25 августа 2018

У меня есть базовое приложение 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 голосов
/ 25 августа 2018

Это происходит при сохранении объекта, когда Hibernate считает, что необходимо сохранить объект, связанный с тем, который вы сохраняете.

также перед сохранением роли в базе данных вы сохраняете пользователя, что неверно, поскольку сеанс гибернации не знает об этом объекте до этого момента. Чтобы избавиться от этой ошибки, используйте CascadeType.ALL в сопоставлениях.

0 голосов
/ 25 августа 2018

Включить cascade = "all" (при использовании xml) или cascade = CascadeType.ALL (при использовании аннотаций) в отображение вашей коллекции.

Потому что выиметь коллекцию в вашей сущности, и эта коллекция содержит один или несколько элементов, которых нет в базе данных.Используя вышеуказанную опцию, вы указываете hibernate сохранять их в базу данных при сохранении их родителя.

...