Java Hibernate联接继承:仅按ID从子表查询记录
我有一个类的层次结构,如next:Java Hibernate联接继承:仅按ID从子表查询记录,java,hibernate,joined-subclass,Java,Hibernate,Joined Subclass,我有一个类的层次结构,如next: @Entity @Inheritance(strategy=InheritanceType.JOINED) @Table(name="Person") public class Person implements Serializable{ @Id @Column(name = "PersonID", unique = true, nullable = false) @GeneratedValue(strategy=Generatio
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@Table(name="Person")
public class Person implements Serializable{
@Id
@Column(name = "PersonID", unique = true, nullable = false)
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
}
@Entity
@Table(name="Student")
@PrimaryKeyJoinColumn(name="PersonID")
public class Student extends Person{
}
@Entity
@Table(name="Bachelor")
@PrimaryKeyJoinColumn(name="PersonID")
public class Bachelor extends Student{
@OneToMany(mappedBy = "bachelor", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<BachelorExam> exams;
}
@Entity
@Table(name="Exam")
public class Exam implements Serializable {
@Id
@Column(name = "ExamID", unique = true, nullable = false)
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
}
@Entity
@Table(name="BachelorExam")
public class BachelorExam implements Serializable {
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "PersonID_FK", referencedColumnName = "PersonID")
private Bachelor bachelor;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "ExamID_FK", referencedColumnName = "ExamID")
private Exam exam;
}
<T extends Person> T getStudentById(Long studentId);
@实体
@继承(策略=InheritanceType.JOINED)
@表(name=“Person”)
公共类Person实现可序列化{
@身份证
@列(name=“PersonID”,unique=true,nullable=false)
@GeneratedValue(策略=GenerationType.AUTO)
私有int-id;
}
@实体
@表(name=“Student”)
@PrimaryKeyJoinColumn(name=“PersonID”)
公营班级学生人数{
}
@实体
@表(name=“学士”)
@PrimaryKeyJoinColumn(name=“PersonID”)
公立本科学生{
@OneToMany(mappedBy=“bamber”,fetch=FetchType.LAZY,cascade=CascadeType.ALL)
私人考试;
}
@实体
@表(name=“考试”)
公共类考试实现了可序列化{
@身份证
@列(name=“ExamID”,unique=true,nullable=false)
@GeneratedValue(策略=GenerationType.AUTO)
私有int-id;
}
@实体
@表(name=“BachelorExam”)
公共类Bacelorexam实现可序列化{
@manytone(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@JoinColumn(name=“PersonID\u FK”,referencedColumnName=“PersonID”)
私立学士;
@manytone(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
@JoinColumn(name=“ExamID_FK”,referencedColumnName=“ExamID”)
自考;
}
我希望使用通用方法(如下一步)通过ID从相应的表中获取用户(普通学生或学士):
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@Table(name="Person")
public class Person implements Serializable{
@Id
@Column(name = "PersonID", unique = true, nullable = false)
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
}
@Entity
@Table(name="Student")
@PrimaryKeyJoinColumn(name="PersonID")
public class Student extends Person{
}
@Entity
@Table(name="Bachelor")
@PrimaryKeyJoinColumn(name="PersonID")
public class Bachelor extends Student{
@OneToMany(mappedBy = "bachelor", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<BachelorExam> exams;
}
@Entity
@Table(name="Exam")
public class Exam implements Serializable {
@Id
@Column(name = "ExamID", unique = true, nullable = false)
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
}
@Entity
@Table(name="BachelorExam")
public class BachelorExam implements Serializable {
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "PersonID_FK", referencedColumnName = "PersonID")
private Bachelor bachelor;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "ExamID_FK", referencedColumnName = "ExamID")
private Exam exam;
}
<T extends Person> T getStudentById(Long studentId);
T getStudentById(长studentId);
这个方法可以是
public <T extends Person> T getUserById(Long personId) {
List<Class<?>> studentTypes = new LinkedList<>();
studentTypes.add(Student.class);
studentTypes.add(Bachelor.class);
for (Class aClass : studenTypes) {
List<T> results = getDatabaseProvider().getDataFromDatabase(String.format("select u %s as u " +
"where u.userId = '%d'", aClass.getName(), userId));
return results.get(0);
}
}
public T getUserById(长personId){
ListTo您尝试使用每个类的表
继承类型到哪个类?我尝试了每个类的表
继承给类的人。所以它是@heritance(strategy=heritancetype.Table\u Per\u class)
而不是@heritance(strategy=heritancetype.JOINED)
尝试将其添加到学生
类中。不起作用。表BacheloreSAM仍然只有要考试的外键,但没有用于单身汉表的外键。为什么您也需要查询学生表?只需查询单身汉表,您的学生类扩展Person,单身汉扩展Student,当您创建时,两者都将具有相同的Id这是单身汉的一个新例子。