单向的@OneToOne导致外键为空。

问题描述 投票:0回答:1

我有两个实体。

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;
}

尽管 UserStudent 被添加到我的数据库中, user_id 栏中 student 表总是被设置为空。我还检查了 User 被添加到 Student 已被正确初始化,并填充了所有信息,但交易已被提交。

spring hibernate entity relationship one-to-one
1个回答
1
投票

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.