hibernate
La optimización del rendimiento
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.