Detached Entities and FetchType
In Chapter 9, we discussed how managed entity instances become detached from a persistence context when the persistence context ends. Since these entity instances are no longer managed by any persistence context, they may have uninitialized properties or relationships. If you are returning these detached entities to your clients and basically using them as data transfer objects between the client and server, you need to fully understand the effects of accessing any uninitialized relationships.
When an entity instance becomes detached, its state might not be
fully initialized, because some of its persistent properties or
relationships may be marked as lazily loaded in the mapping metadata. Each
relationship annotation has a fetch() attribute that specifies whether the
relationship property is loaded when the entity is queried. If the
fetch() attribute is set to FetchType.LAZY, then the relationship is not
initialized until it is traversed in your code:
Employee employee = entityManager.find(Employee.class, id); employee.getPhones().size();
Invoking the size() method of the phones collection causes the relationship to be loaded from the database. It is important to note that this lazy initialization does not happen unless the entity bean is being managed by a persistence context. If the entity bean is detached, the specification is not clear on what actions the persistence provider should perform when accessing an unloaded relationship of a detached entity. ...