首页 > 解决方案 > 与不同实体的单向@OneToOne 关系

问题描述

我有一User堂课:

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User implements UserDetails {
    @Id
    @GeneratedValue
    Long id;

    @NotBlank
    private String name;
    @NotBlank
    private String password;

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

    @Override
    public boolean isAccountNonExpired() {
        return false;
    }

    @Override
    public boolean isAccountNonLocked() {
        return false;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return false;
    }

    @Override
    public boolean isEnabled() {
        return false;
    }
}

对可能用于 aStudent或 a的用户帐户进行建模Teacher。他们只能拥有一个帐户,因此要指定这种关系,我想通过@OneToOne 关系对其进行建模,但我无法理解将其设为单向是否是个好主意。

此外,User该类可以同时引用 aStudent和 a Teacherby 逻辑,如果我需要从其User帐户开始检索用户的详细信息怎么办?根据我的理解,我应该创建一个双向关系,但是,我需要在User类中放置哪个实体?

标签: javaspringhibernaterestorm

解决方案


您可以使用枚举:

public enum UserType {
    STUDENT("Student"),
    TEACHER("Teacher");


    private final String displayValue;

    UserType(String displayValue) {
        this.displayValue = displayValue;
    }
    public String getDisplayValue() {
        return displayValue;
    }
}

在您的用户实体中:

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User implements UserDetails {
    @Id
    @GeneratedValue
    Long id;

    @NotBlank
    private String name;
    @NotBlank
    private String password;

    private List<String> roles = new ArrayList<>();

    @Enumerated(EnumType.STRING)
    private UserType userType;


    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return this.roles.stream().map(SimpleGrantedAuthority::new).collect(toList());
    }

    @Override
    public String getUsername() {
        return null;
    }

    @Override
    public boolean isAccountNonExpired() {
        return false;
    }

    @Override
    public boolean isAccountNonLocked() {
        return false;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return false;
    }

    @Override
    public boolean isEnabled() {
        return false;
    }
}


推荐阅读