# Hibernate liefert mir bei many-to-one leeres Feld



## markusk21 (15. Mrz 2010)

Hallo miteinander,
Ich versuche immer noch mit hibernate klar zu kommen und gerade als ich dachte - jetzt läuft es, kommt sowas...
Ich habe eine Klasse Hochschule mit einem many-to-one Objekt wg.
Hier ist das Mapping:
[XML]<hibernate-mapping>
  <class name="data.Hochschule" table="hochschulen">
    <id column="HochschuleID" name="HochschuleID" type="integer">
      <generator class="increment"/>
    </id>
    <property column="Hochschule" name="Hochschule" not-null="true" type="string" unique="true"/>
    <many-to-one column="WgID" name="wg"/>
  </class>
</hibernate-mapping>[/XML]
Zur Erklärung: z.B. Hochschulen TU München und Uni München gehören zu einer WG "München".

Dieser code liefert, was ich haben möchte (sogar noch über das Objekt Person):

```
List starterLst = sess.createQuery( "from data.Person" ).list();
List starterLst = sess.createQuery( "from data.Person" ).list();

	  for( int i=0; i<starterLst.size(); i++ ) {
	    	data.Person person = (data.Person)starterLst.get( i );

	    java.util.Vector<String> tmpVector = new java.util.Vector<String>();
	    tmpVector.add(person.getVorname());
	    tmpVector.add(person.getNachname());
	    tmpVector.add(person.getHochschule().getHochschule());
	    try{
		tmpVector.add(person.getHochschule().getWg().getWgName());
	    }catch(java.lang.NullPointerException ex){
		// Die Hochschule hat keine zugehörige WG - Null-wert wird eingesetzt
		tmpVector.add(null);
	    }
```
Dem tmpVector wird also für die Liste sowohl die Hochschule, als auch die wg übergeben.

Ich möchte nun natürlich einer Hochschule aus den vorhandenen WGs eine zuordnen können und möchte das über eine ComboBox realisieren. Der Combobox habe ich die WG-Objekt übergeben, sodass sie direkt ausgewählt werden können.

ich habe jetzt schon den Code auf eine einzige Hochschule reduziert, aber die WG enthält im folgenden Code 0 als wgId und null als wgName:

```
this.session = persistence.HibernateUtil.getSessionFactory().openSession();

	java.util.List<data.Hochschule> tmpListe = session.createQuery("from data.Hochschule").list();
	org.hibernate.Hibernate.initialize(tmpListe);

	    hochschule = tmpListe.get(1);
	wg = tmpListe.get(1).getWg();
	hochschule.setWg(wg);
	gui.admin.EinzelneHochschulePanel panel = new gui.admin.EinzelneHochschulePanel(hochschule);
	panel.setVisible(true);
	this.add(panel);
```
Ich möchte natürlich irgendwann die ganze Hochschulliste haben, aber zum Testen beschränke ich mich auf .get(1)
Die Instanz hochschule wird mit korrektem namen und id angelegt. Aber die wg hat wie oben geschrieben die Werte wgId = 0 und wgname = null.
In der Datenbank ist alles korrekt abgelegt - ich kann gar nicht sagen, wie oft ich das kontrolliert hab.
Da ich mich mit hibernate nicht auskenne und grad darüber gelesen hab, dachte ich es läge am lazy-loading und hab versucht a) mit initialize die Liste vollständig zu laden und b) wg direkt anzusprechen, weil es ja dann nachgeladen werden sollte.
Ich habe initialize auch mal tmpListe.get(1) übergeben, auch das hat nichts geändert.

Ich weiß nicht mehr wo ich suchen soll - hat jemand eine Idee, wo der Fehler liegt?


----------



## SlaterB (15. Mrz 2010)

Zeile 6-8 im unteren Code sind etwas seltsam
> hochschule = tmpListe.get(1);
> wg = tmpListe.get(1).getWg();  // wieso nochmal tmpListe.get(1), das ist doch dasselbe wie die kürzere Variable hochschule?
> hochschule.setWg(wg); // wieso in der hochschule dieselbe wg erneut setzen?

allgemein ist nicht ersichtlich warum die Hochschule in tmpListe nun eine Wg haben sollte, kann doch sein dass diese nicht gesetzt ist?
der erste Code sagt mehr oder weniger aus, dass alle Hochschulen, die Personen zugeordnet sind, eine Wg haben,
aber vielleicht gibts noch andere Hochschulen?
gibt jeweils die Id der Hochschule mit aus, schau auch in der Datenbank-Tabelle nach, wie dort die Situation ist

-----

> <property column="Hochschule" name="Hochschule" ...

Java-Attribute besser klein schreiben genau wie die Klassenattribute, getter und setter dazu groß


----------



## markusk21 (15. Mrz 2010)

Danke erst mal für die Antwort!

Ja, es wird irgendwann mal so sein, dass auch keine WG gesetzt ist - aber es soll bitteschön erst mal wenigstens das gehen.

Wie ich schon schrieb, in der Datenbank ist alles, wie ich es erwarte.
tmpListe.get(1) (Es ist die "MHH Hannover") hat eine wg! In der Datenbank (Tabelle hochschulen) steht bei Datensatz 2 (wie erwartet) wgId=1. Und das ist (auch erwartungsgemäß) "Hannover" in der Tabelle WGs.


----------



## SlaterB (15. Mrz 2010)

hmm,

hier noch zwei Symptom-Tester:
1.)
Mapping ändern oder eine zweite Klasse auf dieselbe DB-Tabelle mappen, das Id-Feld als normales Attribut laden, steht dann was drin?
2.) Hibernate erlaubt auch SQL-Queries:
session.createSQLQuery("select WgId, Name from Hochschulen");
usw.
wie siehts dort auf, Ids vorhanden?

aber egal was rauskommt, richtig erklären kann es nichts, 
entweder die Id wird dort angezeit, dann weiß man immer noch nicht wieso im Mapping nicht,
oder die Id fehlt dort auch, dann ist das konsistent aber man weiß immer noch nicht wieso sie überall fehlt

die Daten sind auch wirklich schon länger da und nicht Teil einer noch nicht kommiteten Transaktion oder so?
führe aus einem SQL-Tool z.B.
update hochschule set Name = 'Hannover 96' where wgId = was auch immer;
wenn das commited wird, und auch in Hibernate so ankommt aber die Id dort immer noch fehlt ist weiter was faul,
wenn aber die Id fehlt und der Name noch der alte ist, dann passt das eher zusammen


----------



## markusk21 (15. Mrz 2010)

Also der Reihe nach:

```
java.util.List<Object[]> tmpListe2 = session.createSQLQuery("select WgId, Hochschule from Hochschulen").list();
	for (int i = 0; i<tmpListe2.size();i++){
	    System.out.println("Hochschule: " + (String)tmpListe2.get(i)[1] + " WgId: " + (Integer)tmpListe2.get(i)[0]);
	}
```
liefert:

```
Hochschule: Uni Hannover WgId: 1
Hochschule: MHH Hannover WgId: 1
Hochschule: FH Hannover WgId: 1
Hochschule: TU Braunschweig WgId: 2
Hochschule: FH Kiel WgId: 6
Hochschule: Uni Kiel WgId: 6
Hochschule: WG Berlin WgId: 3
Hochschule: WG Freiburg WgId: 5
Hochschule: WG Köln WgId: 4
```

ids sind also da.

Ich habe dann auch mal

```
UPDATE HOCHSCHULEN SET HOCHSCHULE='MH Hannover' WHERE HOCHSCHULEID=2
```
ausgeführt (im hsql-Database-Manager) - funktioniert und kommt im Java-Programm an.
Die Daten liegen in einer hsqldb, server-mode, die Daten sind also im klartext einsehbar.
In der serverTest.log steht (am Ende): 

```
/*C72*/SET SCHEMA PUBLIC
ROLLBACK
DISCONNECT
/*C73*/SET SCHEMA PUBLIC
ROLLBACK
DISCONNECT
/*C63*/SET SCHEMA PUBLIC
DELETE FROM HOCHSCHULEN WHERE HOCHSCHULEID=2
INSERT INTO HOCHSCHULEN VALUES(2,'MH Hannover',1)
COMMIT
```
Alle anderen Werte stehen in der serverTest.script (Auszug):

```
INSERT INTO WGS VALUES(1,'Hannover')
INSERT INTO WGS VALUES(2,'Braunschweig')
INSERT INTO WGS VALUES(3,'Berlin')
INSERT INTO HOCHSCHULEN VALUES(1,'Uni Hannover',1)
INSERT INTO HOCHSCHULEN VALUES(2,'MHH Hannover',1)
INSERT INTO HOCHSCHULEN VALUES(3,'FH Hannover',1)
INSERT INTO HOCHSCHULEN VALUES(4,'TU Braunschweig',2)
```


----------



## markusk21 (15. Mrz 2010)

Also, 
es scheint, als wäre (fast) alles in Ordnung.
Es trafen nur 2 Probleme aufeinander:
1) meine ComboBox funktioniert noch nicht und 
2) im Debugger von netbeans werden die Daten eben nicht angezeigt.

Festgestellt hab ich das erst, nachdem ich auf die altmodische Art System.out.printlin bemüht habe...
Back to the Roots...

Vielen Dank,  SlaterB, für die Mühe!


----------

