2013-02-27 29 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