Hibernate:Hibernate为Fetch模式Eager做出的多个选择查询

时间:2016-12-28 18:12:18

标签: java mysql spring hibernate jpa

我刚开始在我的应用程序中使用Hibernate。此外,我正在使用JPA存储库来使用自定义查询。我有多个实体,它们之间有关系。我在连接列上使用了Fetch模式作为“EAGER”,并且还使用了Cache。我观察到Hibernate正在进行多个选择查询以获取每个实体而不是在单个查询中执行它。

以下是一个实体:

@Entity
@Table(name = "entity_a")
public class EntityA implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    ...

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "entity_a")
    @JsonIgnore
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    private Set<EntityB> entityB = new HashSet<>();

我正在使用JPA自定义查询获取我的实体,如下所示:

EntityA entityA = entityARepository.findOneById(id);

Hibernate为上述语句发出select查询。

每当我执行entityA.getEntityB()时,它会在EntityB上发出另一个select语句。如何避免这种情况。如何使用Hibernate在单个选择中获取两个实体?

1 个答案:

答案 0 :(得分:0)

entity_a是否包含名为mappedBy的字段?该名称应与FetchType.EAGER属性中声明的名称完全相同。

通常,JPA提供商必须遵守@Fetch(FetchMode.JOIN)模式。这似乎是一个配置错误的问题。即便如此,虽然JPA提供商需要热切地加载热切的关联,但不能保证它将在单个查询中完成。有一个特定于Hibernate的注释可以用作提示:{{1}}。试一试,看看它是否有效。