Ihre Argumentation ist gültig (im Allgemeinen; wir können jedoch über das spezifische Beispiel des Feldes age
diskutieren), aber leider gibt es dafür keine einfache Lösung. Tatsächlich hat Hibernate das Konzept fetch profiles, aber es ist derzeit sehr begrenzt (Sie können den Standard-Abrufplan/die Standardstrategie nur mit den Join-Style-Abrufprofilen überschreiben).
So könnte die mögliche Problemumgehung für Ihr Problem wie folgt sein.
1) Bewegen age
an eine separate Einheit und assoziieren die Person
Einheit mit ihm mit einem faulen einer Eins-zu-Eins-Beziehung:
@Entity
class PersonAge {
private Integer age;
}
@Entity
class Person {
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true, optional = false)
@JoinColumn(name = "PERSON_AGE_ID")
private PersonAge personAge;
public Integer getAge() {
return personAge.getAge();
}
public void setAge(Integer age) {
personAge.setAge(age);
}
}
2) ein Profil fetch definieren, welche die Rückstellung eine überschreibt:
@FetchProfile(name = "person-with-age", fetchOverrides = {
@FetchProfile.FetchOverride(entity = Person.class, association = "personAge", mode = FetchMode.JOIN)
})
3) Aktivieren Sie dieses Profil für jede Sitzung in der Anwendung:
session.enableFetchProfile("person-with-age");
Je nach verwendetem Framework sollte es einen einfachen Hook/Interceptor geben, mit dem Sie das Profil für jede Sitzung (Transaktion) aktivieren können, die craeted ist. Zum Beispiel könnte ein Ansatz im Frühjahr darin bestehen, AbstractPlatformTransactionManager.doBegin des verwendeten Transaktionsmanagers außer Kraft zu setzen.
Auf diese Weise wird die personAge
eifrig in alle Sitzungen in der Anwendung geladen werden, sofern das Abrufprofil nicht explizit deaktiviert ist.
4) Disable das Abrufprofil in der Sitzung, in der Sie die gewünschten Kriterien Abfrage verwenden:
session.disableFetchProfile("person-with-age");
diese Weise wird der Standardplan Abruf-/Strategie verwendet wird (in den Entitätszuordnungen angegeben), das ist das faule Laden der PersonAge
.
Ich glaube, das ist nicht möglich, aber das Gegenteil ja, machen es faul und lösen seine Initialisierung bei Bedarf. –
Fügen Sie in Ihrer Entität 'Person' dem Feld 'Alter' Annotation '@Basic (fetch = FetchType.LAZY)' hinzu. Gib wenigstens einen Schuss ab. –
@ PawełGłowacz Ich kenne diesen Stil, und ich mag es nicht. Es sollte Teil der Kriterien sein, nicht der Umsetzung der Entität. –