Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

276
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!