传递给独立实体以保留在SpringBoot应用程序中

时间:2018-08-16 07:24:58

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

我有一个基本的SpringBoot应用程序。使用Spring Initializer,JPA,嵌入式Tomcat,Thymeleaf模板引擎以及作为可执行JAR文件的程序包,我具有以下实体: 我有一家公司的用户实体

@Entity
@Table(name="t_user")
public class User implements Serializable, UserDetails {



 @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Company company;

}

我创建了一家公司,保存了它,然后将其附加到用户:

user.setCompany(companyService.findAll().iterator().next());

但是当我保存用户时,出现此错误:

detached entity passed to persist: com.elcor.backend.persistence.domain.backend.Company

,这里是服务层中的createUser方法

  @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);

            //Plan plan = new Plan(plansEnum);
            // It makes sure the plans exist in the database
            //if (!planRepository.exists(plansEnum.getId())) {
             //   plan = planRepository.save(plan);
            //}

            //user.setPlan(plan);

            for (UserRole ur : userRoles) {
                roleRepository.save(ur.getRole());
            }

            user.getUserRoles().addAll(userRoles);


            localUser = userRepository.save(user);

        }

        return localUser;
    }

2 个答案:

答案 0 :(得分:0)

我认为这是由于char* add_spaces_to_string(const char* input) { char input_string[100]; strcpy(input_string, input); char* output = (char*)malloc(sizeof input_string * 2); const char mc[] = "Mc"; // Special case for the first character, we don't touch it output[0] = input_string[0]; unsigned int output_index = 1; unsigned int input_index = 1; unsigned int capital_found = 0; unsigned int number_found = 0; while (input_string[input_index]) { if (isdigit(input_string[input_index])) { if (number_found < input_index - 1) { output[output_index] = ' '; output_index++; output[output_index] = input_string[input_index]; } number_found = input_index; } else if (isupper(input_string[input_index])) { if (capital_found < input_index - 1) { output[output_index] = ' '; output_index++; output[output_index] = input_string[input_index]; } capital_found = input_index; } output[output_index] = input_string[input_index]; output_index++; input_index++; } output[output_index] = '\0'; return output; } 具有持久性 并尝试保留已经与持久性上下文分离的实体。

因此,请尝试使用以下命令删除CascadeType.PERSIST埠:

cascade = CascadeType.ALL

答案 1 :(得分:0)

问题与级联有关。 如果要使用CascadeType.ALL,请不要分别保存公司和用户。 无论您要保存的公司实体是什么,都将其附加到用户实体,然后仅保存用户实体。 公司实体将自动保留。