Buscar..


No utilice el tipo de búsqueda EAGER

Hibernate puede usar dos tipos de recuperación cuando mapea la relación entre dos entidades: EAGER y LAZY .

En general, el tipo de recuperación EAGER no es una buena idea, porque le dice a JPA que siempre obtenga los datos, incluso cuando estos datos no son necesarios.

Por ejemplo, si tiene una entidad de Person y la relación con Address como esta:

@Entity
public class Person {

  @OneToMany(mappedBy="address", fetch=FetchType.EAGER)
  private List<Address> addresses;

}

Cada vez que consulte a una Person , la lista de Address de esta Person también se devolverá.

Entonces, en lugar de mapear su entidad con:

@ManyToMany(mappedBy="address", fetch=FetchType.EAGER)

Utilizar:

@ManyToMany(mappedBy="address", fetch=FetchType.LAZY)

Otra cosa a la que hay que prestar atención son las relaciones @OneToOne y @ManyToOne . Ambos son EAGER por defecto . Por lo tanto, si le preocupa el rendimiento de su aplicación, debe establecer la búsqueda para este tipo de relación:

@ManyToOne(fetch=FetchType.LAZY)

Y:

@OneToOne(fetch=FetchType.LAZY)

Usar composición en lugar de herencia.

Hibernate tiene algunas estrategias de herencia. El tipo de herencia JOINED hace una unión entre la entidad secundaria y la entidad principal.

El problema con este enfoque es que Hibernate siempre trae los datos de todas las tablas involucradas en la herencia.

Por ejemplo, si tiene las entidades Bicycle y MountainBike usando el tipo de herencia JOINED :

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Bicycle {

}

Y:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class MountainBike extends Bicycle {

}

Cualquier consulta de JPQL que llegue a MountainBike traerá los datos de Bicycle , creando una consulta SQL como:

select mb.*, b.* from MountainBike mb JOIN Bicycle b ON b.id = mb.id WHERE ...

Si tiene otro padre para Bicycle (como Transport , por ejemplo), esta consulta anterior también trae los datos de este padre, haciendo una ÚNICA ADICIONAL.

Como puede ver, este es un tipo de mapeo de EAGER también. No tiene la opción de traer solo los datos de la tabla MountainBike usando esta estrategia de herencia.

Lo mejor para el rendimiento es la composición de uso en lugar de la herencia.

Para lograr esto, puede mapear la entidad MountainBike para tener una bicycle campo:

@Entity
public class MountainBike {

    @OneToOne(fetchType = FetchType.LAZY)
    private Bicycle bicycle;

}

Y Bicycle

@Entity
public class Bicycle {

}

Cada consulta ahora traerá solo los datos de MountainBike por defecto.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow