# [Hibernate] Warum bekomme ich ein PersistentSet?



## Guest (12. Apr 2007)

Hallo zusammen

Ich habe in der Klasse "Parent" ein Set von "Child" wie folgt gemapt:


```
<set name="children" cascade="all" lazy="false">
           <key update="true">
				<column name="objid" sql-type="smallint"/>
			</key>
            <one-to-many class="Child"/>
        </set>
```

Warum bekomme ich, wenn ich nun ein session.load(parent, ?) mache ein PersistentSet und kein normales Set?

Würde mich über eine schnelle Antwort freuen, da ich gerade ziemlich im Stress bin!

Danke!


----------



## KSG9|sebastian (12. Apr 2007)

Zeig mal den Code zum laden des Sets. 

PersistensSet ist lediglich ein gewrapptes Set. Hatte das Problem noch nie, bei mir funktioniert das eigentlich so wie bei dir und ich bekomm dann ein (Hash)Set zurück.
Hast mal session.get versucht?


----------



## Guest (12. Apr 2007)

Danke!

Mit get() ändert sich leider nichts.
So lese ich einen Parent und zugleich die Childern:

```
public Parent read(Long id) {
		Session session = null;
		Transaction trx = null;
		Parent parent = new Parent ();
		try {
			session = (Session)transaction.getWorkingObject();
			trx = session.beginTransaction();
			session.load(parent , id); // o. parent = (Parent) session.get(Parent.class, id);
			trx.commit();
		} catch (Exception e) {}
		return parent;
	}
```

Es ist nicht das erste Mal, dass ich sowas mache, normalerweise klappt es :?.
Kann das an der neueren Hibernateversion liegen?


----------



## KSG9|sebastian (12. Apr 2007)

Welche Hibernateversion verwendest du? 3.1? Post mal bitte die komplette Mappingdatei...evtl. noch die hibernate.cfg.xml


----------



## Guest (13. Apr 2007)

Es handel sich um die Version 3.2.2.

Die Mappingdatei sieht folgendermasen aus:


```
<hibernate-mapping>
  <class name="Parent" table="PARENT">
    <id..../>
    <property.../>
    <set name="children" cascade="all" lazy="false">
      <key update="true">
        <column name="objid" sql-type="smallint"/>
      </key>
      <one-to-many class="Child"/>
    </set>
  </class>
  
  <class name="Child" table="CHILD">
    <id..../>
    <property.../>
  </class>
</hibernate-mapping>
```

Die einzige Einstellung in der config, die nichts mit dem Verbindungsaufbau zu tun hat, ist folgende:

```
<property name="hibernate.jdbc.use_streams_for_binary">true</property>
```

Danke für deine Hilfe!


----------



## Ullenboom (15. Apr 2007)

Der Grund ist einfach: Hibernate verwaltet eine eigenes Set, um Lazy-Loading zu ermöglichen. Ist Lazy-Loading bei 1:n:-Assoziationen eingestellt (Standard), dann wird die Sammlung erst dann geladen, wenn es einen Zugriff auf die Sammlung gibt (Anfragen, add(), …). Der Punkt ist nun: Wie sollte ein Persistence-Provider mitbekommen, dass jmd. nun Daten aus der Sammlung lesen will? Daher fängt das PersistentSet (http://www.hibernate.org/hib_docs/v3/api/org/hibernate/collection/PersistentSet.html) von Hibernate als Proxy die Anfragen ab (PersistentSet ist ein waschechtes java.util.Set) und kann so vor dem tatsächlichen Zugriff auf die Sammlung die Daten schnell laden.

Übrigens hat man in der JPA auch nur die Basis-Collection-Schnittstellen wie Set, List, ... aber keine konkreten Klassen wie HashSet, TreeSet,... Die PersistentSet-Doku schreibt aber: „The underlying collection is a HashSet.”


----------

