Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como implementar a versão ligh Entity com o repositório Jpa?


O Spring fornece dois mecanismos que podem ser usados ​​para limitar os dados a serem buscados.

Projeções


As projeções podem ajudá-lo a reduzir os dados, recuperados do banco de dados, definindo exatamente quais atributos você deseja buscar.

Exemplo:

@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 entidade


Anotação EntityGraph pode ajudá-lo a reduzir a quantidade de consultas ao banco de dados, definindo exatamente quais entidades relacionadas você precisa buscar.

Exemplo:

@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
}

Existem dois tipos de EntityGraph :
  1. EntityGraphType.LOAD - é usado para especificar um gráfico de entidade, atributos que são especificados por nós de atributo do gráfico de entidade são tratados como FetchType.EAGER e os atributos que não são especificados são tratados de acordo com seu FetchType especificado ou padrão .
  2. EntityGraphType.FETCH - é usado para especificar um gráfico de entidade, atributos que são especificados por nós de atributo do gráfico de entidade são tratados como FetchType.EAGER e os atributos que não são especificados são tratados como FetchType.LAZY .

PS: Lembre-se também de que você pode definir o tipo de busca lenta:@ManyToOne(fetch = FetchType.LAZY) e o JPA não buscará entidades filhas quando o pai estiver sendo buscado.