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)