Java 在Hibernate 4中,内部联接用于子对象,同时访问;“每个子类一个表”;
在Hibernate4中,当访问“每个子类一个表”的对象时,内部联接用于子对象 [编辑:这是Hibernate 4.3.5中的一个bug,将在4.3.6中修复。] 我有以下课程 教授-基础班 ContractProfessor-从Professor派生的类 全职教授-由教授派生的课程 全职教授包含一个系的强制性目标。[在SQL中不为空] 教室包含Professor的对象,该对象可以为空 当我询问教室时,我得到了错误。当我看到这个查询时,它正在与部门进行内部联接。如果它正在检索的教室是ContractProfessor,那么它将没有Department,并且内部连接失败,它将抛出异常 因为Professor对象可以为null,所以它应该始终对所有连接使用left join。但是,这是全职教授和系主任之间的内在联系。因此,当我试图检索教室对象时,会出现异常 这在Hibernate3中运行良好。但是,当我使用Hibernate4.3.5-Final时,我会出错 在不更改DB模式的情况下,我应该如何修复此问题 下面是相同的代码和sql 在Hibernate 4.3.5-Final中生成的查询Java 在Hibernate 4中,内部联接用于子对象,同时访问;“每个子类一个表”;,java,sql,hibernate,join,Java,Sql,Hibernate,Join,在Hibernate4中,当访问“每个子类一个表”的对象时,内部联接用于子对象 [编辑:这是Hibernate 4.3.5中的一个bug,将在4.3.6中修复。] 我有以下课程 教授-基础班 ContractProfessor-从Professor派生的类 全职教授-由教授派生的课程 全职教授包含一个系的强制性目标。[在SQL中不为空] 教室包含Professor的对象,该对象可以为空 当我询问教室时,我得到了错误。当我看到这个查询时,它正在与部门进行内部联接。如果它正在检索的教室是Contra
select
professor0_.id as id1_6_0_,
professor0_.name as name2_6_0_,
professor0_1_.hourlyRate as hourlyRa1_2_0_,
professor0_2_.DepartmentId as Departme3_4_0_,
professor0_2_.salary as salary1_4_0_,
case
when professor0_1_.id is not null then 1
when professor0_2_.id is not null then 2
when professor0_.id is not null then 0
end as clazz_0_,
department1_.id as id1_3_1_,
department1_.name as name2_3_1_
from
Professor professor0_
left outer join
ContractProfessor professor0_1_
on professor0_.id=professor0_1_.id
left outer join
FulltimeProfessor professor0_2_
on professor0_.id=professor0_2_.id
inner join
Department department1_
on professor0_2_.DepartmentId=department1_.id
where
professor0_.id=?
在Hibernate3中生成查询
select
professor0_.id as id2_1_,
professor0_.name as name2_1_,
professor0_1_.hourlyRate as hourlyRate3_1_,
professor0_2_.DepartmentId as Departme3_8_1_,
professor0_2_.salary as salary8_1_,
case
when professor0_1_.id is not null then 1
when professor0_2_.id is not null then 2
when professor0_.id is not null then 0
end as clazz_1_,
department1_.id as id1_0_,
department1_.name as name1_0_
from
Professor professor0_
left outer join
ContractProfessor professor0_1_
on professor0_.id=professor0_1_.id
left outer join
FulltimeProfessor professor0_2_
on professor0_.id=professor0_2_.id
left outer join
Department department1_
on professor0_2_.DepartmentId=department1_.id
where
professor0_.id=?
java教授
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
@Entity
@Table(name = "Professor")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Professor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "Professor id: " + getId() + " name: " + getName();
}
}
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name="ContractProfessor")
public class ContractProfessor extends Professor {
private long hourlyRate = 1;
public long getHourlyRate() {
return hourlyRate;
}
public void setHourlyRate(long hourlyRate) {
this.hourlyRate = hourlyRate;
}
public String toString() {
return "ContractProfessor id: " + getId() + " name: " + getName();
}
}
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
@Entity
@Table(name="FulltimeProfessor")
public class FulltimeProfessor extends Professor {
private long salary = 1;
@ManyToOne(fetch = FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name = "DepartmentId", nullable = false)
private Department department;
public Department getDepartment()
{
return department;
}
public void setDepartment(Department department)
{
this.department = department;
}
public long getSalary() {
return salary;
}
public void setSalary(long salary) {
this.salary = salary;
}
public String toString() {
return "FullTimeProfessor id: " + getId() + " name: " + getName();
}
}
java
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
@Entity
@Table(name = "Professor")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Professor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "Professor id: " + getId() + " name: " + getName();
}
}
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name="ContractProfessor")
public class ContractProfessor extends Professor {
private long hourlyRate = 1;
public long getHourlyRate() {
return hourlyRate;
}
public void setHourlyRate(long hourlyRate) {
this.hourlyRate = hourlyRate;
}
public String toString() {
return "ContractProfessor id: " + getId() + " name: " + getName();
}
}
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
@Entity
@Table(name="FulltimeProfessor")
public class FulltimeProfessor extends Professor {
private long salary = 1;
@ManyToOne(fetch = FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name = "DepartmentId", nullable = false)
private Department department;
public Department getDepartment()
{
return department;
}
public void setDepartment(Department department)
{
this.department = department;
}
public long getSalary() {
return salary;
}
public void setSalary(long salary) {
this.salary = salary;
}
public String toString() {
return "FullTimeProfessor id: " + getId() + " name: " + getName();
}
}
FulltimeProfessor.java
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
@Entity
@Table(name = "Professor")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Professor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "Professor id: " + getId() + " name: " + getName();
}
}
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name="ContractProfessor")
public class ContractProfessor extends Professor {
private long hourlyRate = 1;
public long getHourlyRate() {
return hourlyRate;
}
public void setHourlyRate(long hourlyRate) {
this.hourlyRate = hourlyRate;
}
public String toString() {
return "ContractProfessor id: " + getId() + " name: " + getName();
}
}
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
@Entity
@Table(name="FulltimeProfessor")
public class FulltimeProfessor extends Professor {
private long salary = 1;
@ManyToOne(fetch = FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name = "DepartmentId", nullable = false)
private Department department;
public Department getDepartment()
{
return department;
}
public void setDepartment(Department department)
{
this.department = department;
}
public long getSalary() {
return salary;
}
public void setSalary(long salary) {
this.salary = salary;
}
public String toString() {
return "FullTimeProfessor id: " + getId() + " name: " + getName();
}
}
Department.java
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "Department")
public class Department
{
private long id;
private String name;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "Department id: " + getId() + " name: " + getName();
}
}
java
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
@Entity
@Table(name = "Classroom")
public class Classroom
{
private long id;
private String name;
private Professor professor;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "Classroom id: " + getId() + " name: " + getName();
}
@ManyToOne(fetch = FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name = "ProfessorId", nullable = true)
public Professor getProfessor()
{
return professor;
}
public void setProfessor(Professor professor)
{
this.professor = professor;
}
}
InnerJoinMain.java
import java.util.Collection;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
public class InnerJoinMain
{
public static void main(String[] args) throws Exception
{
EntityManagerFactory emf = Persistence.createEntityManagerFactory("ProfessorService");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
int time = (int)((new Date().getTime() / 1000) % 10000);
System.out.println(time);
ContractProfessor cprof = new ContractProfessor();
cprof.setName("CProf" + time);
cprof.setHourlyRate(time);
em.persist(cprof);
Department dept = new Department();
dept.setName("Dept" + time);
em.persist(dept);
FulltimeProfessor fprof = new FulltimeProfessor();
fprof.setName("Fprof" + time);
fprof.setDepartment(dept);
fprof.setSalary(time + 10);
em.persist(fprof);
Classroom cls = new Classroom();
cls.setName("Classroom" + time);
cls.setProfessor(cprof);
em.persist(cls);
cls = new Classroom();
cls.setName("Classroom" + (time+1));
cls.setProfessor(fprof);
em.persist(cls);
cls = new Classroom();
cls.setName("Classroom" + (time+2));
em.persist(cls);
em.getTransaction().commit();
em.getTransaction().begin();
Query query = em.createQuery("SELECT c FROM Classroom c");
for(Classroom c : (Collection<Classroom>) query.getResultList()) {
System.out.println(c);
}
em.getTransaction().commit();
em.close();
emf.close();
}
}
import java.util.Collection;
导入java.util.Date;
导入javax.persistence.EntityManager;
导入javax.persistence.EntityManagerFactory;
导入javax.persistence.persistence;
导入javax.persistence.Query;
公共类
{
公共静态void main(字符串[]args)引发异常
{
EntityManagerFactory emf=Persistence.createEntityManagerFactory(“ProfessorService”);
EntityManager em=emf.createEntityManager();
em.getTransaction().begin();
int time=(int)((new Date().getTime()/1000)%10000);
系统输出打印LN(时间);
ContractProfessor cprof=新ContractProfessor();
cprof.setName(“cprof”+时间);
cprof.setHourlyRate(时间);
em.persist(cprof);
部门=新部门();
部门名称(“部门”+时间);
em.persist(dept);
全职教授fprof=新的全职教授();
fprof.setName(“fprof”+时间);
财务部(部门);
fprof.设置量程(时间+10);
em.persist(fprof);
教室cls=新教室();
cls.setName(“教室”+时间);
大学教授(cprof);
em.persist(cls);
cls=新教室();
cls.setName(“教室”+(时间+1));
教授(fprof);
em.persist(cls);
cls=新教室();
cls.setName(“教室”+(时间+2));
em.persist(cls);
em.getTransaction().commit();
em.getTransaction().begin();
Query Query=em.createQuery(“从教室c中选择c”);
for(课堂c:(集合)query.getResultList()){
系统输出打印ln(c);
}
em.getTransaction().commit();
em.close();
emf.close();
}
}