sábado, 22 de octubre de 2016

JPA 2.1 Entity Graph: Conceptos básicos

Uno de los problemas comunes a la hora de tratar con JPA es la relación entre tablas y la obtención de datos de tablas relacionadas. Si defines LAZY y luego obtienes los datos de la tabla relacionada, haces demasiadas consultas. Pero si defines la relación como EAGER obtienes demasiados datos en cada consulta. 

Para solucionarlo en la especificación 2.1 de JPA desarrollaron los 'Entity Graph'. Estos nos permiten definir conjuntos de entidades, y de esta forma automatizar la obtención de los objetos correctamente. Podemos verlo con este ejemplo donde la clase 'Computer' tiene asociado un 'Keyboard'. 

@Entity
@Table( name = "COMPUTER", catalog = "myBBDD" )
@NamedEntityGraph( name = "graph.computer.keyboard", attributeNodes = { @NamedAttributeNode( value = "keyboard" ) } )
public class Computer implements Serializable {
 private Integer idComputer;
 private Keyboard keyboard;
...
}

En el siguiente ejemplo podemos ver lo siguiente: Si realizamos una consulta normal sobre 'Computer' (llamada 1). Solo obtendremos la clase 'Keyboard' si hacemos una llamadas específica a un atributo de la clase, generando una consulta extra. Pero si indicamos el Entity Graph definido, no solo obtendremos la clase Computer, sino también la clase Keyboard. Todo ello en una única consulta.


public interface ComputerDao extends JpaRepository<Computer, Integer> {
 //Llamada 1
 @Override
 List<Computer> findAll(); 

 //Llamada2
 @Override
 @EntityGraph( "graph.computer.operator" )
 Page<Computer> findAll( Pageable pageRequest );
...
}

A mi me parece una forma algo más cómoda para realizar consultas y que obtengan datos de tablas relacionadas, mejorando así el rendimiento de la lógica. Pero si solo quieres obtener un conjunto determinado de datos de la clase principal y su relacionada vas a tener que seguir usando JPQL. 

No hay comentarios:

Publicar un comentario