Handel并在hibernate中实现两种类型的用户:spring boot和security

Handel并在hibernate中实现两种类型的用户:spring boot和security,hibernate,spring-boot,design-patterns,spring-security,hibernate-mapping,Hibernate,Spring Boot,Design Patterns,Spring Security,Hibernate Mapping,我是spring boot和hibernate的初学者,我正在开发我的第一个应用程序,在hibernate中设计关系时遇到了问题 我有两个用户(广告客户和学生)都有共享属性,但有一个不同,广告客户属于组织,但学生属于大学(关系如下图数据库图所示) 我曾经尝试过创建一个用户类,但是其中引用了广告客户和学生,Featch类型为LAZY,所以我检查了用户的类型,当它是广告客户时,获取广告客户对象,否则为学生对象 代码如下 -但我很困惑,在hibernate中实现不同用户类型的正确方法是什么? -根据

我是spring boot和hibernate的初学者,我正在开发我的第一个应用程序,在hibernate中设计关系时遇到了问题 我有两个用户(广告客户和学生)都有共享属性,但有一个不同,广告客户属于组织,但学生属于大学(关系如下图数据库图所示)

我曾经尝试过创建一个用户类,但是其中引用了广告客户和学生,Featch类型为LAZY,所以我检查了用户的类型,当它是广告客户时,获取广告客户对象,否则为学生对象 代码如下 -但我很困惑,在hibernate中实现不同用户类型的正确方法是什么? -根据设计模式原则,这是一个好的代码设计吗? -如果我想让User class@Embaddable,让广告商和学生继承它,这样我就可以去掉数据库中的User表,那么在spring安全中,我必须访问两个表才能得到用户,这会比以前更好吗


@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(nullable = false) @Enumerated(EnumType.STRING)
    private AccountState state;

    @Column(nullable = false) @Enumerated(EnumType.STRING)
    private UserType type;

    @Column(nullable = false)
    private String firstName;

    @Column(nullable = false)
    private String lastName;

    @Column(nullable = false, unique = true)
    private String email;

    @Column(nullable = false) @Temporal(TemporalType.DATE)
    private Date birthday;

    @Column(nullable = false)
    private String password;

    @Transient
    private String confirmPass;

    @OneToOne(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Advertiser advertiser;

    @OneToOne(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Student student;

// setters and getters 
}

@Entity
public class Advertiser {

    @EmbeddedId
   private AdvertiserId advertiserId;

    @OneToOne
    @JoinColumn(name = "user_id", insertable = false, updatable = false)
    private User user;

    @ManyToOne
    @JoinColumn(name = "organization_id", insertable = false, updatable = false)
    private Organization organization;

// setter and getter 
}

@Entity
public class Student{

    @EmbeddedId
    private StudentId studentId;


    @OneToOne
    @JoinColumn(name = "user_id", insertable = false, updatable = false)
    private User user;

    @ManyToOne
    @JoinColumn(name = "university_id", insertable = false, updatable = false)
    private University university;

    // setter and getter
    }


不必为学生和广告客户指定特定的表。您可以使用类似is_student的标志列。基于此,您可以实现您的逻辑。这里有一个FIELD call userType