I have a userAccount entity mapped with a country entity . The country mapping in UserAccount class is like this
@ManyToOne(fetch=FetchType.EAGER)
@Fetch(FetchMo
Satadru Biswas gave the answer in a previous comment .
Hibernate 3.x ignores the FetchMode annotation when you use the Query interface (Session.createQuery) so in this case you have to add an INNER JOIN FETCH clause to the FROM part of your query.
The criteria interface however will use this interface correctly.
I try use @Fetch(FetchMode.JOIN) hibernate adnotation in all api (JPQL and CriteriaBuilder) but didn't work. Only this code in service class work fine:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<UserAccount > cq = cb.createQuery(UserAccount.class);
Root<UserAccount> o = cq.from(UserAccount.class);
o.fetch("country",JoinType.INNER);
em.createQuery(cq.select(o)).getResultList();
I'm using the criteria query to fetch Customers.
public class PurchaseOrder
{
.....
.....
@ManyToOne(fetch=FetchType.EAGER, optional=true)
@JoinColumn(name="ReportingCustomer_ID", nullable=true, insertable=false, updatable=false)
@Fetch(FetchMode.JOIN)
@NotFound(action=NotFoundAction.IGNORE)
public ReportingCustomer getReportingCustomer()
{
return reportingCustomer;
}
}
While getting PurchaseOrder it does a LEFT OUTER JOIN as below
select ... from PurchaseOrder this_ left outer join ReportingCustomer reportingc2_
on this_.ReportingCustomer_ID=reportingc2_.ReportingCustomer_ID
where ...
I use "Progress" driver to connect to DB. I'm not sure why it fires m+1 queries only in scenario 2.
Remove the fetch=FetchType.EAGER
. Eager fetching triggers cascading select statements.