Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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 4中,内部联接用于子对象,同时访问;“每个子类一个表”;_Java_Sql_Hibernate_Join - Fatal编程技术网

Java 在Hibernate 4中,内部联接用于子对象,同时访问;“每个子类一个表”;

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

在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中生成的查询

 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();
}
}