2012-04-25 105 views
2

短版休眠:一個一對一的關係有太多的疑問

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只做兩個選擇?

由於

+0

不應該是人 - 工作關係'@ ManyToOne'?許多人完成同樣的工作。 – viktor 2012-04-25 21:29:13

回答

7

這是n + 1問題,爲此,Hibernate manual建議使用JOIN提取模式的一個例子。您可以使用特定於休眠的註釋啓用此功能

@Fetch(FetchMode.JOIN) 
2

您沒有一對一關係,您有一對多關係。一份工作可以有多個人加入。 Hibernate假設實際上存在一對一的關係,並沒有注意到三個人正指向1個工作。 然後,你必須解決N + 1選擇問題,就像beerbajay指出的那樣。