2013-02-27 57 views
2

我使用Hibernate 4.1.10.Final作爲我的JPA提供者,Spring和Spring MVC。有兩個實體:find(Class,id)和JPQL獲取不同的對象(JPA)

@Entity 
@Table(name = "a") 
public class A { 
    @Id 
    private String id; 

    @OneToMany(mappedBy = "a", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private Set<B> bs; 
} 

@Entity 
@Table(name = "b") 
public class B { 
    @Id 
    private String id; 

    @ManyToOne 
    @JoinColumn(name = "fk_a_id") 
    private A a; 
} 

我需要得到一個A和它的b S,所以我用的EntityManager的find(A.class,id)

A a1 = em.find(A.class, id); 
a1.getBs().size(); 

的量,結果爲:的b S上的大小爲零(這意味着沒有相關聯的B)。 但我確信數據庫中有許多關聯的Bs,並且實際上可以在通過控制檯檢查時從數據庫加載數據。

當我使用查詢:

Query query = em.createQuery("SELECT a FROM A AS a WHERE a.id = ?1",A.class); 
query.setParameter(1, id); 
A a= (A) query.getSingleResult(); 
a.getBs().size(); // = 22 

我,而不是得到一個大小= 22

有什麼不對?

+0

設定休眠* show_sql *屬性,看什麼也是有差別的在執行SQL查詢。 – 2013-02-27 03:07:30

+0

我已經比較了兩個執行的sqls,而使用Query的sqls只是一個select子句並解決了關聯,但find()有一些步驟可以做到這一點。首先,它加載A然後加載關聯的實體。但是bs沒有與A關聯。 – 2013-02-27 06:04:30

回答

0

由於您在@OneToMany中使用了mappedBy屬性,因此該關係的所有者爲B而不是A.這就是爲什麼當您加載A的實例時,相應的Bs未加載。嘗試用修改您的註解如下:

在A類:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
@JoinColumn(name="fk_a_id") 
private Set<B> bs; 

在B類:

@ManyToOne 
@JoinColumn(name = "fk_a_id", insertable=false, updatable=false) 
private A a; 
+0

我這樣檢查,但沒有得到正確的bs。它的大小是零。 – 2013-02-28 01:54:47

+0

所以我更喜歡JPQL,但找不到() – 2013-02-28 01:58:39