2016-03-19 4 views
1

Ich habe eine @Entity A, die eine andere Entität B verweist, die OneToOne-Beziehung verwendet. Ich hole Einheit Eine Feder Daten JpaRepository mitSpring Data JPA erhalten Entitäts-Fremdschlüssel ohne die abhängige Entity Lazy Load zu verursachen

A a = aRepository.findById(1); 
int b_id = a.getB().getId(); 

Wie man sehen kann ich ID der B Tabelle abfragen müssen, aber um das zu tun, ich brauche Getter der B-Tabelle zu nennen, die faul verursachen - Laden der B-Tabelle selbst Ich möchte das nicht machen, weil das einzige, was ich brauche, die get ID ist, sonst nichts, und diese ID ist in der ersten A Tabelle vorhanden.

Gibt es einen Trick, der mir hilft, ID der abhängigen Tabelle zu erhalten, ohne neue Abfrage auszulösen?

UPDATE

@Entity 
class A { 
    @Id 
    private Long id; 

    @OneToOne 
    private B b; 
} 

@Entity 
class { 
    @Id 
    private Long id; 
} 
+0

Sie fragen keine Tabellen ab. Sie fragen Objekte ab. Sie können benutzerdefinierte Abfragen definieren – Jens

+0

@SergeiLedvanov Ich glaube, in Ihren Entitätsklassen verwenden Sie Hibernate-Annotationen für das Feld/die Eigenschaft. Wenn Sie also die Methode getId() wie in a.getB(). GetId() für die Entität aufrufen, wird der Proxy (des Gruppenobjekts) initialisiert und die Datenbank abgefragt. Wenn Sie nur die ID der Entität abrufen möchten, können Sie die Hibernate-Annotationen in die Getter-Methoden einfügen. Dies initialisiert den Proxy (B-Objekt) nicht, um die ID zurückzugeben. Kannst du es mit Getter-Annotationen versuchen? –

Antwort

2

Ohne an der Entitätszuordnung zu suchen, wie ich vermute, könnte Ihre Entitätsklassen hibernate annotations on the field verwendet werden. Wenn Sie also die getId() - Methode wie in a.getB().getId() für die Entität aufrufen, führt dies dazu, dass der Proxy (d. H. B-Objekt) initialisiert wird und die Datenbank abruft, um sie abzurufen.

Also, wenn die Absicht nur ist, die id der Entität zu bekommen, können Sie stattdessen den Ruhezustand annotations on the getter methods setzen. Dies führt nicht zum Initialisieren des Proxy (B-Objekt), um die id zurückzugeben. Wenn Sie auf eine andere Eigenschaft als die ID zugreifen, führt dies zu einem Treffer in der Datenbank. Verwendung Eigenschaft/Getter Accesslype statt Feld Zugang

Werfen Sie einen Blick auf ähnliche Fehler bei HHH-3718

Also, versuchen. Als ein Beispiel, anstatt die Anmerkungen auf dem Feld des Vergebens

@Id 
@GeneratedValue(...) 
private long id; 

Ort, um sie auf den Getter

@Id 
@GeneratedValue(...) 
public long getId() { ... } 

Stellen Sie sicher, dass ähnliche Veränderungen an allen Bereichen der B Einheit zu machen. Obwohl Sie später @Access(AccessType.PROPERTY/FIELD) erkunden können.

Es gibt bereits eine verwandte bug HHH-3718 in Bezug auf dieses Verhalten.

Und ein verwandtes Thema auf Hibernate Forum in Bezug auf Feld vs Immobilien Zugangsart, die von Interesse sein könnte für Sie Field Vs Property access

Ihre Entitäten Klassen der Veröffentlichung würden helfen, wenn dies das Problem nicht lösen.

+0

Danke. Das hat tatsächlich geholfen. –

+0

Hibernate 5.2.12 löst nicht mehr das Abrufen der ID aus – Sam

Verwandte Themen