我刚开始在我的应用程序中使用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在单个选择中获取两个实体?
答案 0 :(得分:0)
entity_a
是否包含名为mappedBy
的字段?该名称应与FetchType.EAGER
属性中声明的名称完全相同。
通常,JPA提供商必须遵守@Fetch(FetchMode.JOIN)
模式。这似乎是一个配置错误的问题。即便如此,虽然JPA提供商需要热切地加载热切的关联,但不能保证它将在单个查询中完成。有一个特定于Hibernate的注释可以用作提示:{{1}}。试一试,看看它是否有效。