Mysql
 sql >> Database >  >> RDS >> Mysql

Come implementare la versione light Entity con il repository Jpa?

Spring fornisce due meccanismi che possono essere utilizzati per limitare il recupero dei dati.

Proiezioni

Le proiezioni possono aiutarti a ridurre i dati, recuperati dal database, impostando esattamente quali attributi vuoi recuperare.

Esempio:

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

Grafico entità

Annotazione EntityGraph può aiutarti a ridurre la quantità di query al database, impostando esattamente quali entità correlate devi recuperare.

Esempio:

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

Esistono due tipi di EntityGraph :

  1. EntityGraphType.LOAD - viene utilizzato per specificare un grafico di entità, gli attributi specificati dai nodi di attributo del grafico di entità vengono trattati come FetchType.EAGER e gli attributi non specificati vengono trattati in base al FetchType specificato o predefinito .
  2. EntityGraphType.FETCH - viene utilizzato per specificare un grafico di entità, gli attributi specificati dai nodi di attributo del grafico di entità vengono trattati come FetchType.EAGER e gli attributi non specificati vengono trattati come FetchType.LAZY .

PS: Ricorda inoltre che puoi impostare il tipo di recupero pigro:@ManyToOne(fetch = FetchType.LAZY) e JPA non recupererà le entità figlio durante il recupero del genitore.