Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment implémenter la version light Entity avec le référentiel Jpa ?

Spring fournit deux mécanismes qui peuvent être utilisés pour limiter les données à récupérer.

Projections

Les projections peuvent vous aider à réduire les données extraites de la base de données en définissant exactement les attributs que vous souhaitez récupérer.

Exemple :

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

Graphique d'entité

Annotation EntityGraph peut vous aider à réduire le nombre de requêtes dans la base de données, en définissant exactement les entités liées que vous devez récupérer.

Exemple :

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

Il existe deux types de EntityGraph :

  1. EntityGraphType.LOAD - est utilisé pour spécifier un graphe d'entité, les attributs spécifiés par les nœuds d'attribut du graphe d'entité sont traités comme FetchType.EAGER et les attributs qui ne sont pas spécifiés sont traités en fonction de leur FetchType spécifié ou par défaut .
  2. EntityGraphType.FETCH - est utilisé pour spécifier un graphe d'entité, les attributs spécifiés par les nœuds d'attribut du graphe d'entité sont traités comme FetchType.EAGER et les attributs qui ne sont pas spécifiés sont traités comme FetchType.LAZY .

PS : Rappelez-vous également que vous pouvez définir le type de récupération différée :@ManyToOne(fetch = FetchType.LAZY) et JPA ne récupère pas les entités enfants lorsque le parent est en cours de récupération.