Basically for single associations use fetch: 'join' (using lazy:false means that there will be 2 sql statements per association.). However for one to many use lazy:false
Configuring Eager Fetching
An alternative approach that avoids the N+1 queries is to use eager fetching, which can be specified as follows:
class Airport { String name static hasMany = [flights: Flight] static mapping = { flights lazy: false } }
In this case the
flights
association will be loaded at the same time as its Airport
instance, although a second query will be executed to fetch the collection. You can also use fetch: 'join'
instead of lazy: false
, in which case GORM will only execute a single query to get the
airports and their flights. This works well for single-ended
associations, but you need to be careful with one-to-manys. Queries will
work as you'd expect right up to the moment you add a limit to the
number of results you want. At that point, you will likely end up with
fewer results than you were expecting. The reason for this is quite
technical but ultimately the problem arises from GORM using a left outer
join.
So, the recommendation is currently to use
fetch: 'join'
for single-ended associations and lazy: false
for one-to-manys.
Be
careful how and where you use eager loading because you could load your
entire database into memory with too many eager associations. You can
find more information on the mapping options in the section on the ORM DSL.
No comments:
Post a Comment