【问题标题】:Hibernate: Too many queries for a One to One relationship休眠:一对一关系的查询太多
【发布时间】:2012-04-25 21:10:55
【问题描述】:

短版

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

职位类别:

@Entity
@Table(name = "jobs")
public class Job{

  @Id
  @GeneratedValue
  @Column
  private Integer id;

  @Column
  private String name;
}

显示所有人员及其工作:

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

我的预期:两个选择,五个人的一个,三个不同工作的一个(三个人有相同的工作)

我得到了:四个选择,一个用于人员,三个用于每个不同的工作

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

如果我有 1000 个人和 1000 个不同的工作,我会看到 1000 个选择被执行。我怎样才能让 Hibernate 只做两个选择?

谢谢

【问题讨论】:

  • 不应该是人-工作关系@ManyToOne?许多人完成了相同的工作。

标签: java sql hibernate one-to-one


【解决方案1】:

这是n + 1 问题的示例,Hibernate manual 建议使用JOIN 获取模式。您可以使用特定于休眠的注释来启用它

@Fetch(FetchMode.JOIN)

【讨论】:

    【解决方案2】:

    您不是一对一的关系,而是一对多的关系。一个工作可以有多个人附加到它上面。 Hibernate 假设实际上存在一对一的关系,并且没有注意到三个人指向一份工作。 然后你必须解决 N+1 选择问题,正如 beerbajay 指出的那样。

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多