我有一个@MappedSuperclass名为Data的数据作为我数据库中每个实体的父级.它包含像Id等公共属性.然后我有一个扩展Data的实体,这也是@MappedSuperclass由于它的子类的共同功能.我的数据库中的映射是正确的.
这是我的层次结构的一个例子
@MappedSuperclass Data | @MappedSuperclass +- Employee | | @Entity | +- FullTimeEmployee | | @Entity | +- PartTimeEmployee | @Entity +- Store
并且表格已正确映射:
FullTimeEmployee PartTimeEmployee Store
无论如何都要查询数据库中所有Employee子类(FullTimeEmployee,PartTimeEmployee)作为Employee的实例而不引用查询中的子类名称?
就像是
List<Employee> allEmployees = getAllEmployees();
Run Code Online (Sandbox Code Playgroud)
我的想法是每当我决定创建另一个Employee子类(即AllDayEmployee)时,我就不必更改查询以包含名称.
因此,正如格雷戈里正确指出的那样,这是不可能的@MappedSuperclass.所以我将其更改为@Entity,因为我想为我使用的每个子类保留一个表InheritanceType.JOINED.
所以现在是上面的层次结构
@MappedSuperclass Data | @Entity | @Inheritance(strategy=InheritanceType.JOINED) +- Employee | | @Entity | +- FullTimeEmployee | | @Entity | +- PartTimeEmployee | @Entity +- Store
表格仍然是:
FullTimeEmployee PartTimeEmployee Store
现在,为了得到所有员工,我只需致电:
entityManager.createQuery("from Employee").getResultList();
Run Code Online (Sandbox Code Playgroud) 我有一个抽象的MappedSuperClass,参与者,它由三种"参与者"扩展.然后每个人都使用自己的'Project',也是一个抽象的MappedSuperClass.但是,我希望基类了解Projects,这样我就可以编写通用代码来与Participants进行交互.如何使用Hibernate注释指定它?以及如何在ExtendedParticipant和ExtendedProject类中覆盖它?
每个Participant类型和每个Project类型都有自己的数据库表,其中包含我无法更改的现有数据和ID(在表中不唯一).
以下代码给出了IDE错误"多对一属性不应该是'Mapped Superclass'".
@MappedSuperclass
public abstract class Participant implements Persistable {
...
@ManyToOne
@JoinColumn(name = "project_id")
public Project getProject() {
return project;
}
public void setProject(Project project) {
this.project = project;
}
...
}
Run Code Online (Sandbox Code Playgroud)
并且Project类与同样的问题大致相同:
@MappedSuperclass
public abstract class Project implements Persistable {
...
@OneToMany
public List<Participant> getParticipants() {
return participants;
}
public void setProject(List<Participant> participants) {
this.participants = participants;
}
...
}
Run Code Online (Sandbox Code Playgroud)