tutorial jpa eclipselink

tutorial - jpa java



Eclipselink Lazy Loading (2)

Estoy ejecutando una prueba en eclipselink JPA 2, para determinar cómo funciona la carga lenta de una colección. He asumido que si carga una entidad, entonces todos los elementos ansiosos se cargan antes que nada, luego, dentro de la sesión JPA, los elementos perezosos se cargan cuando los solicita, o los toca (refiérase a ellos de alguna manera, como obtener el tamaño de una colección floja). El problema que tengo es este: cuando desconecto la entidad de la sesión, la colección perezosa se carga, y está disponible, ¿aunque no lo pedí? O entiendo mal el JSR, o este es el comportamiento normal en eclipselink. Por usar hibernate, sé que esto no sucede.

EntityManager em = emf.createEntityManager(); AloadTest at1 = em.find(AloadTest.class, pkLazy); serializeObject(at1,"InSessionLazy"); em.detach(at1); em.close();

Si ejecuto esto en una depuración y miro mis elementos perezosos, puedo ver que no están cargados cuando accedo a mi objeto ''at1'', pero en el momento en que paso por encima de la línea em.detach (at1), las entidades perezosas se cargan .

Tengo una colección perezosa definida en mi CD AloadTest como tal: ...

@OneToMany(fetch = javax.persistence.FetchType.LAZY, cascade = CascadeType.PERSIST, /*, cascade = CascadeType.ALL, */mappedBy = "aloadtest") public Set<CloadLazyMultitest> getCloadLazyMultitest() { return cloadLazyMultitest; } public void setCloadLazyMultitest(Set<CloadLazyMultitest> cloadLazyMultitest) { this.cloadLazyMultitest = cloadLazyMultitest; }

Gracias de antemano, pero no creo que mi colección perezosa deba cargarse si no lo he pedido.

EDIT: hice tu prueba James, y estás en lo correcto sobre la prueba de indirección:

logger.info(" ARE WE LAZY LOADED BEFORE :"+((IndirectSet)at1.getCloadLazyMultitest()).isInstantiated()); em.detach(at1); logger.info(" ARE WE LAZY LOADED AFTER :"+((IndirectSet)at1.getCloadLazyMultitest()).isInstantiated());

Y la salida a mi logger:

17:14:16.707 [main] INFO c.c.t.j.t.JpaI3EagerAndLazyLoadingTest - ARE WE LAZY LOADED BEFORE :false

17: 14: 16.723 [main] INFO cctjtJpaI3EagerAndLazyLoadingTest - SOMOS LAZY LOADED DESPUÉS: true

¿Mi punto es? ¿Por qué me están cargando cobros perezosos? No pido la colección, solo la entidad matriz. ¿Qué pasaría si tuviera una cadena de 2 o 10 colecciones, cada una anotada como una colección floja? Creo que sería bastante sobrecargado. Nunca antes había sido un problema con Hibernate, pero como eclipselink es ahora la referencia de JPA, tengo que crear una solución basada en esto.

Seguramente está bien separar un objeto, hacerlo "sucio", hacer algún procesamiento y volver a conectarlo a una nueva sesión. ¿Estoy pensando más en un entorno de "conversación larga", probablemente beans de sesión sin estado y un frente web?



Al mirar el último código de EclipseLink, no parece que detach () activará la colección perezosa. ¿Deberías despegarte? ¿Lo está desencadenando?

En general, EclipseLink le permite acceder a relaciones LAZY después de cerrar EntityManger, por lo tanto, aunque haya separado el objeto, aún tendrá acceso a las relaciones (a menos que lo serialice).

Puede verificar si la relación se instancia usando,

((IndirectSet)at1.getCloadLazyMultitest()).isInstantiated()

Verifique esto antes y después de la llamada detach ().

No estoy seguro de por qué está usando separar, es un método bastante raro, básicamente se puede usar para expulsar un objeto del contexto de persistencia para evitar que se escriban en la base de datos.