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

标签 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();

结果是:bs 的大小为零(这意味着没有关联的 B)。 但是我确定数据库中有很多关联的B,并且确实可以在通过控制台检查时从数据库中加载数据。

当我使用查询时:

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

我取而代之的是 size = 22。

怎么了?

最佳答案

由于您在 @OneToMany 中使用了 mappedBy 属性,关系的所有者是 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;

关于java - find(Class,id) 和 JPQL 得到不同的对象 (JPA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15103366/

相关文章:

java - 为什么我不能使用 MySQL 的 mysql.connector.java 库?

java - 从另一个方法调用的@Transactional 方法没有获得事务

java - 使用 ObjectDB JPQL 对搜索结果进行排序

java - 处理大量 JMS 消息类型

java - 确保 spring boot 和 liquibase 接收和处理 SIGTERM

java - CATALINA_HOME 环境变量未正确定义

java - Hibernate 中的孤立删除(当有多个映射对象时)

java - 使用条件 API 获取字符串集合中具有特定元素的所有对象

hibernate - Grails Hibernate Filters插件似乎正在运行,但未过滤结果

jpa - 休眠 jpa 单元测试自动检测不起作用