sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo implementar la versión Ligh Entity con el repositorio Jpa?

Spring proporciona dos mecanismos que se pueden usar para limitar la obtención de datos.

Proyecciones

Las proyecciones pueden ayudarlo a reducir los datos, recuperados de la base de datos, al establecer qué atributos exactamente desea obtener.

Ejemplo:

@Entity
class Person {
    @Id UUID id;
    String firstname, lastname;
    @OneToOne
    Address address;
}

@Entity
static class Address {
    @Id UUID id;
    String zipCode, city, street;
}

interface NamesOnly {
    String getFirstname();
    String getLastname();
}

@Repository
interface PersonRepository extends Repository<Person, UUID> {
    Collection<NamesOnly> findByLastname(String lastname);
}

Gráfico de entidad

Anotación EntityGraph puede ayudarlo a reducir la cantidad de consultas a la base de datos al establecer exactamente qué entidades relacionadas necesita buscar.

Ejemplo:

@Entity
@NamedEntityGraph(name = "GroupInfo.detail", attributeNodes = @NamedAttributeNode("members"))
public class GroupInfo {
    @Id UUID id;
    @ManyToMany //default fetch mode is lazy.
    List<GroupMember> members = new ArrayList<GroupMember>();
}

@Repository
public interface GroupRepository extends CrudRepository<GroupInfo, String> {

    @EntityGraph(value = "GroupInfo.detail", type = EntityGraphType.LOAD)
    GroupInfo getByGroupName(String name); //Despite of GroupInfo.members has FetchType = LAZY, it will be fetched because of using EntityGraph
}

Hay dos tipos de EntityGraph :

  1. EntityGraphType.LOAD - se utiliza para especificar un gráfico de entidades, los atributos especificados por los nodos de atributos del gráfico de entidades se tratan como FetchType.EAGER y los atributos que no se especifican se tratan de acuerdo con su FetchType especificado o predeterminado .
  2. EntityGraphType.FETCH - se utiliza para especificar un gráfico de entidades, los atributos especificados por los nodos de atributos del gráfico de entidades se tratan como FetchType.EAGER y los atributos que no se especifican se tratan como FetchType.LAZY .

PD: Recuerde también que puede establecer el tipo de búsqueda diferida:@ManyToOne(fetch = FetchType.LAZY) y JPA no obtendrá entidades secundarias cuando se obtengan las principales.