14 Stimmen

Wann wird durch das Abrufen der ID eines Hibernate-Proxys der Proxy initialisiert?

Wenn Sie in Hibernate ein Entity über einen Ladevorgang abrufen, wird der Proxy nicht initialisiert, wenn Sie auf den id-Accessor des Entitys zugreifen:

Property myProp = (Property) session.load(Property.class, myId);
myProp.getId(); // Doesn't load the proxy
myProp.getDescription();  // Loads the proxy from the database hit

Mir ist jedoch nicht klar, wie die Regeln für das Laden von Vertretungen von Vereinigungen aussehen. Ich hatte den Eindruck, dass beim Abrufen einer Entität über eine HQL-Abfrage oder ein Kriterium die gleichen Regeln gelten.

Jede Property in meinem Code hat eine Company . Die Company als solche deklariert ist:

@ManyToOne(fetch = FetchType.LAZY, optional=false)
@JoinColumn(name = "company_id", nullable=false)
private Company company;

In meinem Code erhalte ich jedoch derzeit N+1 Selects, wenn ich durch die Properties weil die Company geladen wird, wenn ich die Company.getId() .

Sowohl in der Company y Property Objekt ist das Feld id ein Long mit der Anmerkung @Id .

Gibt es noch eine andere Überlegung, die ich vermisse, um das Laden der Company Wesen?

11voto

Arthur Ronald Punkte 32423

Es funktioniert nicht wie erwartet, und zwar aus folgenden Gründen Sie müssen Property Access verwenden anstelle des Feldzugangs.

Anstelle von

@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(name="COMPANY_ID", nullable=false)
private Company company;

Verwenden Sie

@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(name="COMPANY_ID", nullable=false)
public Company getCompany() {
    return this.company;
}

Achten Sie darauf, dass Sie nicht gleichzeitig den Eigentumszugang und den Feldzugang verwenden können. Also sollten Sie einen Ansatz wählen .

Grüße,

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X