Bre*_*ola 2 java sql hibernate one-to-one
精简版
Hibernate正在执行多个选择查询而不是仅两个以检索一对一关系
长版
人员类:
@Entity
@Table(name = "people")
public class Person{
@Id
@GeneratedValue
@Column
private Integer id;
@Column
private String name;
@OneToOne(optional=false, fetch=FetchType.EAGER)
private Job job;
}
Run Code Online (Sandbox Code Playgroud)
职位类别:
@Entity
@Table(name = "jobs")
public class Job{
@Id
@GeneratedValue
@Column
private Integer id;
@Column
private String name;
}
Run Code Online (Sandbox Code Playgroud)
显示所有人及其工作:
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
List<Person> people = session.createQuery("from Person").list();
for(Person p : people){
System.out.println(p.getName() + " | " + p.getJob().getName());
}
Run Code Online (Sandbox Code Playgroud)
我的期望:两个选择,一个为五个人,一个为三个不同的工作(三个人有相同的工作)
我得到了:四个选择,一个用于人,三个用于他们各自的工作
Hibernate: select person0_.id as id1_, person0_.job_id as job3_1_, person0_.name as name1_ from people person0_
Hibernate: select job0_.id as id0_0_, job0_.name as name0_0_ from jobs job0_ where job0_.id=?
Hibernate: select job0_.id as id0_0_, job0_.name as name0_0_ from jobs job0_ where job0_.id=?
Hibernate: select job0_.id as id0_0_, job0_.name as name0_0_ from jobs job0_ where job0_.id=?
Jim | Programmer
Andrew | DBA
Tomas | Sysadmin
Henry | Sysadmin
Jerry | Sysadmin
Run Code Online (Sandbox Code Playgroud)
如果我有1000个人有1000个不同的工作,我会看到1000个选择被执行.我怎么能这样做Hibernate只做两个选择?
谢谢
这是n + 1
问题的一个例子,Hibernate手册建议使用JOIN
获取模式.您可以使用特定于hibernate的注释启用此功能
@Fetch(FetchMode.JOIN)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4350 次 |
最近记录: |