2011-01-06 10 views
3

Stellen Sie sich zwei Domänenobjektklassen vor: A und B. A hat eine bidirektionale Eins-zu-viele-Beziehung zu B. A steht im Zusammenhang mit Tausenden von B. Die Relationen müssen eindeutig sein, ein Duplikat ist nicht möglich.Überprüfen, ob ein Objekt im Ruhezustand mit einem anderen verbunden ist

Um zu überprüfen, ob eine Instanz von B bereits mit einer bestimmten Instanz von A verbunden ist, könnten wir eine einfache INNER JOIN ausführen, aber dies wird nur die bereits bestehenden Beziehungen sicherstellen.

Was ist mit den aktuellen Übergangsbeziehungen?

class A { 
    @OneToMany 
    private List<B> listOfB; 
} 

Wenn wir Zugriff auf die listOfB und einen Scheck von führen diese werden alle angeschlossenen Instanzen B faul aus der Datenquelle abzurufen. Ich möchte sie nur mit ihrem Primärschlüssel validieren.

Gibt es eine einfache Lösung, wo ich Dinge tun kann, wie „Enthält diese Instanz von A mit dieser Instanz von B verbunden ist?“ ohne all diese Daten in dem Speicher geladen und einen Nachschlag auf Sammlungen basierend Durchführung?

Antwort

2

Thank Sie für alle Antworten. Die extra faule Sammlung hat den Trick für mich gemacht. Ich konfigurierte die @OneToMany Verbindung mit der LazyCollection Annotation.

@IndexColumn(name = "index", base = 1) 
@LazyCollection(LazyCollectionOption.EXTRA) 

Der Artikel Hibernate: Extra-lazy collection fetching half mir dabei. Wenn Sie diese Option verwenden, lösen #size(), #contains(), #get() usw. die Sammlungsinitialisierung nicht aus.

0

Nachdenken über den letzten Absatz Ihrer Frage etwas mehr, da der Verein bidirektional ist, würde ich mit einem Verband zu A. einer Suche auf spezifische Instanz von B tun

+0

Es lädt definitiv alle Objekte, das ist das Problem hier, wir haben ein Leistungsproblem damit. Hibernate erstellt und initialisiert all diese Objekte. – codevour

0

Warum können Sie nicht INNER JOIN durchführen?

Mit dem Standard-Flush-Modus wird Hibernate die Sitzung vor dem Ausführen der Abfrage leeren, so dass nicht gespeicherte Elemente der Auflistung kein Problem darstellen.

1

ich denke, dass es in zwei Schritten getan werden kann. Für transiente B's, Fügen Sie Ihre transienten B's hinzu listOfB fügen Sie auch zu einer transienten Liste hinzu. Und enthält Ihr Checks in dieser Liste.

Für Ihre beharrte B, verwenden Sie eine Abfrage so etwas wie,

select count(*) from B b where b.a.id = :aId 

Wenn diese Abfrage gibt null, kann man sagen, dass es keine Beziehung zwischen A und B ist

Verwandte Themen