Hibernate 当存在多个用户类型时,将用户映射到用户信息

Hibernate 当存在多个用户类型时,将用户映射到用户信息,hibernate,database-design,Hibernate,Database Design,我有一个用户域类。它有两种用户类型。一个是老师,另一个是学生。它有两个字段,一个是teacherInfo,另一个是studentInfo。由于teacheruser有许多不同于studentuser的属性,我无法将它们组合为UserInfo。否则会有很多空字段 所以在hibernate中,我应该如何映射关系。如果使用One-to-One,则要求teacherInfo和studentInfo都不能为空。因此,这没有意义,因为教师用户不应该将studentInfo映射为一对多关系解决了这个问题,但它

我有一个用户域类。它有两种用户类型。一个是
老师
,另一个是
学生
。它有两个字段,一个是
teacherInfo
,另一个是
studentInfo
。由于
teacher
user有许多不同于
student
user的属性,我无法将它们组合为
UserInfo
。否则会有很多空字段

所以在hibernate中,我应该如何映射关系。如果使用
One-to-One
,则要求
teacherInfo
studentInfo
都不能为空。因此,这没有意义,因为教师用户不应该将
studentInfo
映射为<代码>一对多关系解决了这个问题,但它似乎是有线的。我就是不能做决定。谢谢

public class User {

    private Integer id;
    private UserType;
    private TeacherInfo teacherInfo;
    private StudentInfo studentInfo;
}
所以在hibernate中,我应该如何映射关系。如果使用一对一,则要求teacherInfo和studentInfo都不能为null

这是不正确的
@OneToOne
关联可以是
null
。所以你可以用它

public class User {

    @OneToOne
    private TeacherInfo teacherInfo;

    @OneToOne
    private StudentInfo studentInfo;

}
您可以使用
@Embedded

public class User {

    @Embedded
    private TeacherInfo teacherInfo;

    @Embedded
    private StudentInfo studentInfo;

}
甚至这种方法
@ManyToOne
@OneToOne

class Teacher {

        @ManyToOne
        private User user;  

}

class Student {

        @ManyToOne
        private User user;  

}

如果我正确理解了这个问题,应该介绍(抽象)类用户的两个子类,教师和学生,然后遵循中的一个方法(或者遵循建模类继承的原始文档)。谢谢您的回答。“一对一,它要求teacherInfo和studentInfo都不能为null”,我的意思是我在使用延迟加载策略。它要求一对一关系两者都不为null。这是我在用户类中的注释:@OneToOne(optional=false,fetch=FetchType.LAZY,mappedBy=“user”,cascade=CascadeType.ALL)@Tong不使用
optional=false
。只要
@OneToOne(fetch=FetchType.LAZY,mappedBy=“user”,cascade=CascadeType.ALL)
如果我不使用,hibernate将为user、studentInfo和teacherInfo生成三个sql。如果我使用它,将只有一个连接的sql。我认为这提高了效率。是吗?@Tong我不确定三个sql。无论如何,你可以使用HQL(或SQL)连接和投影。事实上我做到了。如下所示:Query userQuery=currentSession().createQuery(“从用户u向左加入获取u.studentInfo,其中u.email=:email”);它起作用了。但是如果我在hql中使用join-fetch,我最终会编写更多的hql代码。我想把它们放在注释中,所以我使用optional=false和@Fetch(FetchMode.JOIN)