Null vs. leere Sammlungen in Hibernate

8

Angenommen, ich habe die folgende Hibernate-Map-Klasse:

%Vor%

Wenn ich ein Objekt von ClassA aus einer Hibernate-Sitzung lese, wird das bList -Feld wie erwartet mit einem PersistentList -Objekt initialisiert.

Ich finde mich mit einer Anforderung wo in Situationen, in denen die Liste leer ist, Ich brauche Hibernate, um das bList -Feld zu null zu initialisieren, anstatt mit einem leeren PersistentList . Theoretisch verfügt Hibernate über die erforderlichen Informationen, da das Abrufen auf der Liste sehr wichtig ist. Das Problem ist, dass laut Abschnitt 6.1 der Hibernate-Dokumentation :

  

Aufgrund der zugrunde liegenden Beziehung   Modell, sammlungwertige Eigenschaften tun   unterstützt keine Nullwert-Semantik.   Hibernate unterscheidet nicht zwischen   eine Nullsammelreferenz und ein   leere Sammlung.

Das ergibt durchaus Sinn, aber ich hoffe, dass jemand eine schlaue List vorbringen kann, um diese Einschränkung zu überwinden. Ich denke, vielleicht ein Listener / Callback-Mechanismus könnte mir erlauben, leere Listen durch Null-Referenzen zu ersetzen.

    
skaffman 21.09.2009, 14:36
quelle

3 Antworten

9

Haben Sie versucht, die Methode getbList () einzutragen? Sie könnten tun:

%Vor%

Hibernate erstellt immer ein Objekt für Ihre Referenzen, aber Sie dürfen die Daten innerhalb der Getter und Setter steuern. Wenn die Liste 0 Elemente enthält, können Sie immer null zurückgeben.

    
amischiefr 21.09.2009, 14:41
quelle
2

Ich bin neugierig, warum Sie das als "Einschränkung" betrachten - hat eine null bList tatsächlich eine andere Bedeutung für Ihre Anwendung als eine leere bList ?

Ich denke, dass in den meisten Bereichen eine Nullsammlung und eine leere Sammlung dieselbe semantische Bedeutung haben, weshalb ich denke, dass die Hibernate-Entwickler versuchten, Hibernate darauf zu beschränken, nur eine zu verwenden. Es macht nicht viel Sinn, immer if (bList == null || bList.isEmpty) zu überprüfen, wenn die beiden immer dasselbe bedeuten.

    
matt b 21.09.2009 14:54
quelle
2

Für die Handhabung in Ihrem Code ist der offensichtliche Weg im Getter, aber das hilft Ihnen nicht, wenn Sie es in HQL auswerten wollen.

Zwei Ideen:

  • Ein Konstruktor, der if auf NULL setzt leer.
  • Eine @PostLoad / @PostConstruct -Methode das macht das gleiche.
Damo 21.09.2009 14:55
quelle

Tags und Links