it-swarm.com.de

Standard-Abruftyp für Eins-zu-Eins, Viele-Zu-Eins und Eins-Zu-Viele im Ruhezustand

Was ist der Standard-Abruftyp in Hibernate-Zuordnungen?

Was ich nach der Erkundung erfahren habe, ist:

  • für eins zu eins ist es eifrig .
  • für eins zu viele ist es faul .

Aber nachdem es in Eclipse getestet wurde, war es für alle eifrig.

Hängt es davon ab, ob ich JPA oder Hibernate verwende?

75
Richa

Das hängt davon ab, ob Sie JPA oder Hibernate verwenden.

Aus der JPA 2.0-Spezifikation sind die Standardwerte:

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

Und im Winterschlaf ist alles faul

UPDATE:

Die neueste Version von Hibernate ist an die oben genannten JPA-Standardwerte angepasst.

132
Ashish Agarwal

Ich weiß, dass die Antworten zum Zeitpunkt der Fragestellung korrekt waren - aber da Leute (wie ich in dieser Minute) immer noch zufällig feststellen, dass sie sich fragen, warum sich ihr WildFly 10 anders verhält, möchte ich ein Update für das aktuelle Hibernate 5 geben .x Version:

Im Hibernate 5.2 User Guide wird in Kapitel 11.2. Abrufstrategien anwenden angegeben:

Die Hibernate-Empfehlung besteht darin, alle Assoziationen statisch zu markieren Faulenz und dynamische Abrufstrategien für den Eifer verwenden. Das ist leider im Widerspruch zu der JPA-Spezifikation, die diese .__ definiert. Alle Eins-zu-Eins- und Viele-zu-Eins-Assoziationen sollten eifrig abgerufen werden standardmäßig. Hibernate respektiert als JPA-Anbieter diesen Standard.

Hibernate verhält sich also genauso wie Ashish Agarwal oben für JPA angegeben:

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

(siehe JPA 2.1 Spec )

46
Alexander Rühl

Hibernate ist eine Implementierung des JPA-Standards, um Ihre Frage zu beantworten. Hibernate hat seine eigenen Macken, aber laut Hibernate docs

Standardmäßig verwendet Hibernate Lazy-Select-Abrufe für Sammlungen und Lazy-Proxy-Abrufe für einwertige Assoziationen. Diese Standardwerte sind in den meisten Anwendungen für die meisten Assoziationen sinnvoll.

Hibernate lädt also jedes Objekt mit einer verzögerten Abrufstrategie, unabhängig von der Art der Beziehung, die Sie deklariert haben. Für ein einzelnes Objekt in einer Eins-zu-eins- oder Many-to-One-Beziehung wird ein Lazy-Proxy (der nicht initialisiert, aber nicht null sein sollte) und eine null-Collection verwendet, die beim Versuch, darauf zuzugreifen, mit Werten hydratisiert wird . 

Es wird darauf hingewiesen, dass der Ruhezustand nur dann versucht, diese Objekte mit Werten zu füllen, wenn Sie versuchen, auf das Objekt zuzugreifen, sofern Sie nicht fetchType.EAGER angeben.

15
JamesENL

Für einwertige Assoziationen, d. H. Eins-zu-Eins und Viele-Zu-Eins: -
Default Lazy = Proxy
Proxy Lazy Loading : - Dies impliziert, dass ein Proxy-Objekt Ihrer zugeordneten Entität geladen wird. Dies bedeutet, dass nur die ID, die die beiden Entitäten verbindet, für das Proxy-Objekt der verknüpften Entität geladen wird.
ZB: A und B sind zwei Entitäten mit vielen zu einer Zuordnung. Dh: Es kann mehrere A-Werte für jedes B geben. Jedes Objekt von A enthält eine Referenz von B.
`

public class A{
    int aid;
    //some other A parameters;
    B b;
}
public class B{
    int bid;
     //some other B parameters;
}

`
Die Relation A enthält Spalten (Beihilfe, Gebot, ... andere Spalten der Entität A).
Die Beziehung B enthält Spalten (Gebot, ... andere Spalten der Entität B)

Proxy impliziert, wenn A abgerufen wird, nur ID für B abgerufen und in einem Proxy-Objekt von B gespeichert wird, das nur ID enthält . Das Proxy-Objekt von B ist ein Objekt einer Proxy-Klasse, die eine Unterklasse von ist B mit nur minimalen Feldern ..__ Da das Gebot bereits Teil der Beziehung A ist, ist es nicht erforderlich, eine Abfrage auszulösen, um das Gebot aus der Beziehung B ..__ abzurufen. Andere Attribute der Entität B werden nur faul geladen, wenn ein Feld anderes ist dann wird auf das Gebot zugegriffen.

Für Sammlungen, d. H. Viele zu viele und eine zu viele: -
Default Lazy = true


Bitte beachten Sie auch, dass die Abrufstrategie (select, join usw.) Lazy überschreiben kann Das heißt: Wenn lazy = 'true' und fetch = 'join' ist, werden beim Abrufen von A auch B oder Bs abgerufen von Sammlungen). Sie können den Grund erhalten, wenn Sie darüber nachdenken .
Der Standardabruf für eine Einzelwertzuordnung ist "join" .
Der Standardabruf für Sammlungen ist "select" . Bitte überprüfen Sie die letzten beiden Zeilen. Das habe ich logisch hergeleitet.

0
Jijo Mathew