Search code examples
javajpaentitylazy-evaluationeager

Fully load entity with JPA before detaching it?


I need to do some processing on an Entity. I'd like it to be outside a transaction. The thing is this entity contains some lazy-loaded fields so that my program fails on accessing some of them because of not having a session active.

The most natural thing to do would be to fully initialize such entity once it's loaded but still in transactional scope (before detaching it). But I can't find how to do that. Is there really no simple method do such a trivial thing? I'd like to stay behind JPA spec.

For some reason fetch all properties in jpql does not work.


Solution

  • Just call a method on the lazy proxies you want to initialize:

    SomeEntity e = ...;
    e.getFoos().size(); // now foos is initialized
    e.getBar().getName(); // now bar is initialized
    

    To load the whole state at once using JPQL, you need to use fetch joins:

    select e from SomeEntity e
    left join fetch e.foos
    left join fetch e.bar
    where ...