Múltiples búsquedas con tipo EAGER en Hibernate con JPA

Tengo una entidad que contiene:

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "assessment") @OrderBy(value = "order ASC") private List assessmentParts = new LinkedList(); @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "assessment") private List texts = new LinkedList(); 

como ve, hay dos colecciones que deben cargarse ansiosamente. Esto no está funcionando e hibernate arroja una excepción:

 Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags 

Eso es porque Hibernate no puede buscar múltiples colecciones de una sola vez. Pero si cambio la List a Set y LinkedList a HashSet esta parte funciona bien, pero la otra – se produce un problema más molesto.

Cuando bash obtener la entidad de la base de datos usando:

 entityManager.find(entityClass, primaryKey); 

Falla con:

 org.hibernate.AssertionFailure: null identifier 

Estoy seguro de que el ID que estoy pasando para find método no es nulo, lo he depurado y estoy seguro de esto. De alguna manera desaparece dentro de Hibernate.

Si cambio los tipos de colección a LAZY todo funciona sin errores, pero hay algunas circunstancias en las que necesito usar EAGER .

¿Alguien tiene una solución para solucionarlo? O bien podría tener un conjunto pero evitar que ocurra un error de aserción o podría tener una lista, pero de alguna manera evitar el error de varias bolsas de recolección.

Estoy usando:

 Hibernate 4.2.2.Final Tomcat 7 JPA 2.0 JDK 1.7 

EDITAR

Acabo de descubrir que al agregar @Fetch(FetchMode.SELECT) soluciona el problema y puedo usar varias listas con el tipo EAGER , pero ¿hay EAGER forma de solucionar esto al no usar las anotaciones específicas de Hibernate? ¿Y por qué solucionó el problema en primer lugar?

La causa raíz del problema es que cuando Hibernate obtiene los resultados de las consultas SQL, no hay una forma simple de saber qué elemento hijo pertenece a qué colección. Vea esta entrada del blog para una explicación más detallada con un ejemplo. Para resumir, tiene las siguientes soluciones alternativas:

  • Cargue cada colección por separado usando la subselección @Fetch(FetchMode.SELECT)
  • Forzar el uso de la lista en lugar de la bolsa agregando la columna de índice @IndexColumn(name="LIST_INDEX")
  • Use la colección desordenada como Establecer.

Si está utilizando Hibernate y no le importa usar las anotaciones de Hibernate:

Anota tus campos de colección con:

 @LazyCollection(LazyCollectionOption.FALSE) 

Recuerde eliminar el atributo fetchType de la anotación @OneToMany.