Reputation: 73
I have just started using Hibernate in my application. Also I'm using JPA repository for using custom query. I have multiple entities which have relationships between them. I have used Fetch mode as 'EAGER' on the join column and also using Cache. I observed that Hibernate is making multiple select queries to fetch each entity and not doing it in a single query.
Below is an entity:
@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<>();
I'm fetching my entity as below, using JPA custom queries:
EntityA entityA = entityARepository.findOneById(id);
Hibernate issues a select query for the above statement.
Whenever I do a entityA.getEntityB()
it issues another select statement on EntityB. How to avoid this. How can I get both entities in a single select using Hibernate?
Upvotes: 1
Views: 2694
Reputation: 10716
Does EntityB
contain a field named entity_a
? The name should be exactly as declared in the mappedBy
attribute.
In general, JPA providers are required to honor the FetchType.EAGER
mode. This seems to be a misconfiguration issue. Even so, while the JPA provider is required to load eager associations eagerly, there is no guarantee it will be done in a single query. There is a Hibernate-specific annotation that can be used as a hint: @Fetch(FetchMode.JOIN)
. Try it out and see if it works.
Upvotes: 1