我有一个基本的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;
}
答案 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,请不要分别保存公司和用户。 无论您要保存的公司实体是什么,都将其附加到用户实体,然后仅保存用户实体。 公司实体将自动保留。