Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

273
Vistas
Hibernate ignora el tipo de recuperación 'perezoso' y carga las propiedades inmediatamente

Uso Hibernate 5.2.5 (también uso kotlin y spring 4.3.5 si eso importa) y quiero que algunos de los campos de mi clase se carguen con pereza. Pero el problema es que todos los campos se cargan inmediatamente, no tengo ninguna configuración especial de Hibernate ni uso Hibernate.initialize().

 @Entity(name = "task") @Table(name = "tasks") @NamedQueries( NamedQuery(name = "task.findById", query = "SELECT t FROM task AS t WHERE t.id = :id") ) class Task { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) var id: Int? = null @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "author_id", nullable = false) lateinit var author: User @OneToOne(fetch = FetchType.LAZY, mappedBy = "task") var edit: TaskEdit? = null }

Así consulto

TaskRepoImpl:

 override fun findById(id: Int): Task? { val task = getCurrentSession().createNamedQuery("task.findById", Task::class.java) .setParameter("id", id) .uniqueResult() return task }

Servicio de tareas:

 @Transactional fun find(id: Int): Task? { return taskRepo.findById(id) }

Y la salida:

 Hibernate: select task0_.id as id1_1_, task0_.author_id as author_i3_1_ from tasks task0_ where task0_.id=? Hibernate: select user0_.id as id1_3_0_, user0_.enabled as enabled2_3_0_, user0_.name as name3_3_0_, user0_.password as password4_3_0_ from users user0_ where user0_.id=? Hibernate: select taskedit0_.id as id1_0_0_, taskedit0_.task_id as task_id3_0_0_, taskedit0_.text as text2_0_0_ from task_edits taskedit0_ where taskedit0_.task_id=?

Por favor, aconseje qué está mal con mi código y cómo hacer que Hibernate cargue las propiedades de forma perezosa. ¡Gracias!

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Hibernate no puede representar su propio objeto. Hay al menos tres soluciones bien conocidas para este problema: La más simple es simular una relación de uno a muchos. Esto funcionará porque la carga diferida de la colección es mucho más fácil que la carga diferida de una sola propiedad anulable, pero en general esta solución es muy inconveniente si utiliza consultas complejas JPQL/HQL. El otro es usar instrumentación de código de bytes de tiempo de compilación. Para obtener más detalles, lea la documentación de Hibernate: 19.1.7. Uso de la obtención de propiedades perezosas. Recuerde que en este caso debe agregar la anotación @LazyToOne(LazyToOneOption.NO_PROXY) a la relación uno a uno para que sea perezosa. Establecer fetch en LAZY no es suficiente. La última solución es usar instrumentación de código de bytes en tiempo de ejecución, pero funcionará solo para aquellos que usan Hibernate como proveedor de JPA en un entorno JEE completo (en tal caso, configurar "hibernate.ejb.use_class_enhancer" en verdadero debería ser el truco: Entity Manager Configuration ) o use Hibernate con Spring configurado para hacer un tejido en tiempo de ejecución (esto puede ser difícil de lograr en algunos servidores de aplicaciones más antiguos). En este caso, también se requiere la anotación @LazyToOne(LazyToOneOption.NO_PROXY).

 @Entity public class Animal implements FieldHandled { private Person owner; private FieldHandler fieldHandler; @OneToOne(fetch = FetchType.LAZY, optional = true, mappedBy = "animal") @LazyToOne(LazyToOneOption.NO_PROXY) public Person getOwner() { if (fieldHandler != null) { return (Person) fieldHandler.readObject(this, "owner", owner); } return owner; } public void setOwner(Person owner) { if (fieldHandler != null) { this.owner = fieldHandler.writeObject(this, "owner", this.owner, owner); return; } this.owner = owner; } public FieldHandler getFieldHandler() { return fieldHandler; } public void setFieldHandler(FieldHandler fieldHandler) { this.fieldHandler = fieldHandler; } }

Puedes probar esto: http://justonjava.blogspot.in/2010/09/lazy-one-to-one-and-one-to-many.html

referencia: ¿Por qué la carga diferida no funciona en una asociación uno a uno?

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda