Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

272
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda