Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie implementiert man eine Light Entity-Version mit dem Jpa-Repository?

Spring bietet zwei Mechanismen, die verwendet werden können, um die abzurufenden Daten einzuschränken.

Projektionen

Projektionen können Ihnen dabei helfen, die aus der Datenbank abgerufenen Daten zu reduzieren, indem Sie festlegen, welche Attribute Sie abrufen möchten.

Beispiel:

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

Entitätsdiagramm

Anmerkung EntityGraph kann Ihnen helfen, die Anzahl der Abfragen an die Datenbank zu reduzieren, indem Sie festlegen, welche genau verwandten Entitäten Sie abrufen müssen.

Beispiel:

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

Es gibt zwei Arten von EntityGraph :

  1. EntityGraphType.LOAD - wird verwendet, um einen Entitätsgraphen zu spezifizieren, Attribute, die durch Attributknoten des Entitätsgraphen spezifiziert sind, werden als FetchType.EAGER behandelt und nicht angegebene Attribute werden gemäß ihrem angegebenen oder standardmäßigen FetchType behandelt .
  2. EntityGraphType.FETCH - wird verwendet, um einen Entitätsgraphen zu spezifizieren, Attribute, die durch Attributknoten des Entitätsgraphen spezifiziert sind, werden als FetchType.EAGER behandelt und nicht angegebene Attribute werden als FetchType.LAZY behandelt .

PS: Denken Sie auch daran, dass Sie den Lazy-Fetch-Typ festlegen können:@ManyToOne(fetch = FetchType.LAZY) und JPA ruft keine untergeordneten Entitäten ab, wenn die übergeordnete Entität abgerufen wird.