我有两个实体。
User.java
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User implements UserDetails {
@Id
@GeneratedValue
Long id;
@NotBlank
String username;
@NotBlank
String password;
@ElementCollection
@Builder.Default
List<String> roles = new ArrayList<>();
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return this.roles.stream().map(SimpleGrantedAuthority::new).collect(toList());
}
@Override
public String getUsername() {
return username;
}
@Override
public boolean isAccountNonExpired() {
return false;
}
@Override
public boolean isAccountNonLocked() {
return false;
}
@Override
public boolean isCredentialsNonExpired() {
return false;
}
@Override
public boolean isEnabled() {
return false;
}
}
Student.java
@Entity
@Data
public class Student {
@Id
String id;
String name;
String firstName;
@OneToOne
@JoinColumn(name = "user_id")
User user;
public void addUser(User user) {
this.user = user;
}
}
这个... StudentService
应增加一个新的 Student
,创建一个新的 User
并将其加入 Student
@Override
public boolean addStudent(StudentDTO student) {
if (!studentRepository.existsById(student.getId())) {
Student s = modelMapper.map(student, Student.class);
studentRepository.save(s);
String username = String.format("s%s", student.getId());
List<String> roles = Arrays.asList("ROLE_STUDENT");
User user = userService.createUser(username, roles);
userService.addUser(user);
s.addUser(user);
return true;
}
return false;
}
该 User
正在创建的 UserService
@Override
public User createUser(String username, List<String> roles) {
String password = RandomStringUtils.randomAlphanumeric(16);
User u = User.builder()
.username(username)
.password(encoder.encode(password))
.roles(roles)
.build();
if (addUser(u)) {
return u;
} else {
throw new UserAlreadyExistingException(username);
}
}
@Override
public boolean addUser(User user) {
boolean alreadyExists = userRepository.findByUsername(user.getUsername()).isPresent();
if (true) {
userRepository.save(user);
return true;
}
return false;
}
尽管 User
和 Student
被添加到我的数据库中, user_id
栏中 student
表总是被设置为空。我还检查了 User
被添加到 Student
已被正确初始化,并填充了所有信息,但交易已被提交。
user_id
因为你没有保存映射到数据库,所以设置为null.修改了代码和注释。
@Override
public boolean addStudent(StudentDTO student) {
if (!studentRepository.existsById(student.getId())) {
Student s = modelMapper.map(student, Student.class);
// don't save student here
String username = String.format("s%s", student.getId());
List<String> roles = Arrays.asList("ROLE_STUDENT");
User user = userService.createUser(username, roles);
userService.addUser(user);
s.addUser(user);
//save student here after adding user.
studentRepository.save(s)
return true;
}
return false;
}