with onetomany one manytomany many ejemplos ejemplo consultas column java hibernate jpa lazy-loading one-to-many

java - onetomany - one to many jpa



Las colecciones de JPA Hibernate no están cargadas de forma perezosa (1)

Una colección perezosa no contiene proxies. La colección en sí es una colección de carga lenta. Esto significa que cuando obtiene un hilo de la base de datos, su lista de respuestas no se inicializará.

Llamar a getReplies() simplemente devolverá esta lista no inicializada. Solo al invocar un método en la propia lista (como size() o iterator() ) Hibernate inicializará la lista ejecutando una consulta SQL cargando el estado de todas las respuestas del hilo.

No es una buena idea usar un depurador para verificar qué contiene la colección, ya que el depurador generalmente llama a los métodos de la lista que están detrás de usted, lo que hace que la lista se inicialice a sí misma. Puede verificar si una colección se inicializa utilizando el método Hibernate.isInitialized(thread.getReplies()) .

Respecto a su otra pregunta: Hibernate se utiliza para asignar filas de bases de datos a objetos. Si un hilo tiene respuestas, Hibernate nunca le dirá que no tiene ninguna devolviéndole una lista vacía. Eso sería un error serio. Si no quiere cargar las respuestas, simplemente no llame a ningún método en la lista de respuestas.

Tengo una configuración JPA de tal manera que si no uso carga lenta, se cargará casi toda la base de datos. También uso la serialización directamente en los modelos, así que a veces necesito inicializar los proxies.

Solo quiero usar carga lenta en las colecciones. El hecho de que algunas entidades singulares se obtengan con entusiasmo funciona bien. Pero no importa cómo intento configurar las colecciones, nunca obtengo una colección de proxies, siempre obtengo la colección completamente cargada.

Este es un código de ejemplo:

@Entity public class Thread implements Externalizable { @OneToMany(mappedBy = "parentThread", fetch = FetchType.LAZY) public List<Reply> getReplies() { return replies; }

Entonces, el problema aquí es que cuando reviso el depurador, la lista de respuestas persistant siempre está llena de información y son los objetos reales de respuesta en lugar de los proxies vacíos que quiero.

Yo uso entityManager.find (Thread.class, "ID") cuando quiero el hilo y todas las colecciones como estas siempre están completamente cargadas, no importa si tengo fetch = FetchType.LAZY o no.

Por lo que yo entiendo, establecer fetchtype perezosa debería funcionar como yo quiero. También me gustaría que las entidades se carguen cuando se utiliza thread.getReplies () para poder serializarlas y enviarlas al cliente. No sé si getReplies funcionará con entidades proxy ya que nunca obtuve ninguna colección para cargarla de forma perezosa.

Por un lado, no uso Intellij y lo usé para configurar JPA con Hibernate. También he hecho una pregunta similar en la que quiero que la colección esté completamente vacía, pero no estoy seguro si eso es posible y, por lo tanto, estoy haciendo esta pregunta.

JPA Hibernate quiere una carga lenta para devolver la colección vacía

Todavía no he visto una buena respuesta sobre esta pregunta aparentemente básica sobre stackoverflow. Por favor, solo responda con un enlace si la pregunta es realmente respondida de manera pedagógica ya que soy nuevo en JPA / Hibernate y también en las bases de datos.

¡Muchas gracias por adelantado!