2 Datensätze, soll einer sein! Hibernate - Mappingproblem?

Lampe

Erfahrenes Mitglied
Ganz komisches Problem, ich seh nicht den Fehler.

Ich habe eine Relation zwischen zwei Tabellen. In beiden Tabellen ist nur ein Datensatz vorhanden. Bei der Abfrage mit Hibernate erhalte ich trotzdem aus einer Tabelle zwei Reihen, nur das der erste Eintrag 'null' ist.

Plant.hbm.xml
Code:
<hibernate-mapping>
    <class name="cr.dipl.datapool.bean.Plant" table="Plant">
      <id name="idPlant" column="idPlant">
      	<generator class="increment"/>
      </id>
      <list name="systems" cascade="all">
      	<key column="Plant_idPlant"/>
      	<index column="idSystem"/>
      	<one-to-many class="bean.System"/>
      </list>
    </class>
</hibernate-mapping>

Plant.java
Code:
public class Plant {
	private int idPlant;
	private List<System> systems = null;
        setter/getter....
}

System.hbm.xml
Code:
<hibernate-mapping>
    <class name="bean.System" table="System">
      <id name="idSystem" column="idSystem">
      	<generator class="increment"/>
      </id>
      <many-to-one name="plant" column="Plant_idPlant" class="bean.Plant" lazy="false"/>
    </class>
</hibernate-mapping>

System.java
Code:
public class System {
	private int idSystem;
	private Plant plant = null;
       setter/getter ....
}

UnitTest.java
Code:
initSession();

Plant plant = (Plant) session.load(Plant.class, 1);

List systems = plant.getSystems();

// Size == 2  Warum? Es ist nur ein Datansatz in der Datenbank.
System.out.printf("systems size: %d\n", systems.size());        	

// Erst der Datensatz ab Index 1 ist gültig
System.out.println( ((bean.System)systems.get(1)).getName());

Vielleicht wisst Ihr weiter, ich auf jedenfall nicht und hoffe auf Tipps von euch!


Danke
 
Zuletzt bearbeitet:
Schon mal geschaut wie hibernate das mappt?
da du eine Relation von Sytem zu Plant und von der Plant Liste zu System hast. läd er es vielelleicht doppelt....

stell mal cascade nicht auf all!

Machst du was in der getter methode der Liste?

wie ist dein hibernate.hbm2ddl.auto wert eingestellt?
damit hab ich schon manche derartigen probleme gehabt, weil de SQL Cleint z.B. nicht richtig synchronisiert hat oder irgend ein Fehler während des mappings war!

Und ich seh auch nicht wo du die Liste mir dem Satz füllst? Nur durch das Laden?

ansonsten weiss ich auch nicht weiter, vielleicht ist ja was dabei!

Soweit, gut nacht erstmal!
 
Zuletzt bearbeitet:
1. Hibernate mappt das super, wenn ich das SQL Statement direkt bei der DB angebe wird auch nur ein Datensatz angezeigt. Selbst wenn ich in der System die Relation weg lasse werden noch n + 1 Datensätze in der Liste gespeichert.

2. Ich habe das Cascade entfernt, ohne Erfolg.

3. Ich liefere im Getter nur die Liste.

4. hbm2ddl ist nicht gesetzt, mir allerdings auch unbekannt was dieser tut.

5. Ja, das session.load(...) füllt die Bean mit Werten, selbst ein createQuery("from Plant WHERE idPlant = 1") liefert für die Systemliste n + 1 Sätze.

Danke für dein Statement, leider konnte ich den Fehler/das Feature :) nicht damit entfernen.

Noch Jemand anderes einen guten Tipp?

Nachtrag:

Ich verwende in meinem System Bean einen Enum-Wert, der geerbete Methoden etc. enthält, könnte es evtl. mit der Serialisierung zusammen liegen?
 
Zuletzt bearbeitet:
Änderung von List zu Set hat es gebracht. Keine Ahnung warum, werde ich in Zukunft wohl nur noch Set verwenden.

Danke
 
Änderung von List zu Set hat es gebracht. Keine Ahnung warum, werde ich in Zukunft wohl nur noch Set verwenden.

Danke

Da musst Du aber vorsichtig sein, das hört sich für mich nur nach einem Workaround an. Es werden sicherlich dennoch n + 1 geholt, nur das Set enthält ja keine doppelten Einträge (ist ein Eintrag schon vorhanden, wird er einfach verworfen). Von daher würde ich nochmal Ursachenforschung betreiben, obwohl ich jetzt leider auch keine weiteren, konstruktiven Vorschläge habe.
 

Neue Beiträge

Zurück