Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate联接继承:仅按ID从子表查询记录_Java_Hibernate_Joined Subclass - Fatal编程技术网

Java Hibernate联接继承:仅按ID从子表查询记录

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

我有一个类的层次结构,如next:

@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这是单身汉的一个新例子。