sql >> Databasteknik >  >> RDS >> Mysql

Hur implementerar man ljus Entity-version med Jpa-förvaret?

Spring tillhandahåller två mekanismer som kan användas för att begränsa data som ska hämtas.

Projektioner

Projektioner kan hjälpa dig att minska data, hämtad från databasen, genom att ställa in exakt vilka attribut du vill hämta.

Exempel:

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

Enhetsdiagram

Anteckning EntityGraph kan hjälpa dig att minska antalet förfrågningar till databasen genom att ställa in exakt vilka relaterade enheter du behöver hämta.

Exempel:

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

Det finns två typer av EntityGraph :

  1. EntityGraphType.LOAD - används för att ange en entitetsgraf, attribut som specificeras av attributnoder i entitetsgrafen behandlas som FetchType.EAGER och attribut som inte är specificerade behandlas enligt deras specificerade eller standard FetchType .
  2. EntityGraphType.FETCH - används för att ange en entitetsgraf, attribut som specificeras av attributnoder i entitetsgrafen behandlas som FetchType.EAGER och attribut som inte är specificerade behandlas som FetchType.LAZY .

PS: Kom också ihåg att du kan ställa in lazy hämtningstyp:@ManyToOne(fetch = FetchType.LAZY) och JPA kommer inte att hämta underordnade enheter när förälder hämtas.




  1. PHP - Hur man uppdaterar data till MySQL när du klickar på en alternativknapp

  2. SQL Server - IN-klausul med flera fält

  3. fråga mycket långsammare med preparerade Statement jämfört med uttalande

  4. Muteringstabell i Oracle 11 orsakad av en funktion