find(Class,id)和JPQL得到不同的对象(JPA)

时间:2013-02-27 02:54:49

标签: java hibernate jpa jpql

我使用Hibernate 4.1.10.Final作为我的JPA提供程序,Spring和Spring MVC。有两个实体:

@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,所以我使用了EntityManager的find(A.class,id)

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

结果是:b s的大小为零(这意味着没有关联的B)。 但我确信数据库中有很多关联的B,实际上数据可以通过控制台进行检查时从数据库中加载。

当我使用Query时:

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。

怎么了?

1 个答案:

答案 0 :(得分:0)

由于您在mappedBy中使用了@OneToMany属性,因此关系的所有者是B而不是A.这就是为什么当您加载A的实例时,不会加载相应的B。尝试使用以下内容修改注释:

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