# Hibernate Liste mit allen Objekten einer Entity



## computersport (6. Sep 2010)

Hallo Community,

Ich versuche im moment eine Liste mit allen Objekten zu bekommen die unter einer Bestimmten
Entity abgespeichert werden.

Aber ich glaub ich stell mich einfach zu blöd an. Vielleicht weiß einer wie es geht.
Hier mal ne Auflistung wie ich es bisher versucht habe

```
List<FabrikListe> fabrikliste = (List<FabrikListe>) session
					.createCriteria(FabrikListe.class).list();
```


```
List<FabrikListe> fabrikliste = (List<FabrikListe>) session.createQuery("from FabrikListe as fabrikliste")
			.list();
```


```
List<FabrikListe> fabrikliste = (List<FabrikListe>) session.createQuery("from FabrikListe")
			.list();
```

greetz
Compi


----------



## SlaterB (7. Sep 2010)

die dritte klingt gut, absolut äquivalent ist

```
List<FabrikListe> fabrikliste = session.createQuery("from FabrikListe").list()
```
man kann nicht generisch casten

----

was funktioniert daran denn nicht?


----------



## computersport (7. Sep 2010)

An sich sollte es ja funktionieren dummerweise krieg ich keine Liste zurückgegeben obwohl in der DB mindestens ein Eintrag vorhanden ist. Ich werd es zuhause nochmal ausprobieren und gucken ob der Fehler evtl. auf der Client seite von GWT liegt und mich dann zurück melden.


----------



## SlaterB (7. Sep 2010)

wie kam/ kommt das Objekt denn in die Liste, zufällig parallel neu eingefügt mit einem DB Tool und noch kein commit?


----------



## computersport (7. Sep 2010)

Also das speichern des Objekts in der Datenbank funktioniert einwandfrei. Hab dort drei einträge aber wenn ich mir die Liste aus der DB hole mit hibernate krieg ich immer ne NullPointerException

Entweder dort wird irgendwas nicht richtig übergeben oder der holt sich nichts aus der DB.


----------



## SlaterB (7. Sep 2010)

es gibt noch
session.createSQLQuery()
wenn da auch nichts kommt, dann liegt es zumindest eher nicht an den Hibernate-Mappings usw.


----------



## computersport (7. Sep 2010)

Klingt jetzt zwar etwas blöd aber wie würde der SQL befehl heißen?

Ich hab mich direkt mit SQL nicht auseinandergesetzt sondern nur mit den Befehlen von Hibernate.


----------



## SlaterB (7. Sep 2010)

select * from richtigerTabellenname

ich frage mich wie du dann auf anderen Wege festgestellt hast, ob etwas in der Tabelle drin ist


----------



## computersport (7. Sep 2010)

Ich glaub ich hab das Problem gefunden:

Dies ist der Code auf der Client seite wo ich mir die Liste hole:

[Java]
	private List<DTOFabrik> getFarbiken() {
		final Container<List<DTOFabrik>> container = new Container<List<DTOFabrik>>();
		FabrikServiceAsync service = (FabrikServiceAsync) GWT.create(FabrikService.class);
		ServiceDefTarget servicedef = (ServiceDefTarget) service;
		servicedef.setServiceEntryPoint(GWT.getModuleBaseURL() + "fabrik");

		AsyncCallback<List<DTOFabrik>> callback = new AsyncCallback<List<DTOFabrik>>() {

			@Override
			public void onSuccess(List<DTOFabrik> result) {
				container.setData(result);

			}

			@Override
			public void onFailure(Throwable caught) {

			}
		};

		service.getFabrikListe(callback);
		List<DTOFabrik> result = container.getData();
		GWT.log(result.get(1).getName());
		return result;

	}
[/code]

Und das ist die Fehler mleudng die ich für "GWT.log(result.get(1).getName());" erhalte

```
java.lang.NullPointerException: null
    at ourProject.client.UI.admin.fabrik.AdminNeueFabrikUI.getFarbiken(AdminNeueFabrikUI.java:252)
    at ourProject.client.UI.admin.fabrik.AdminNeueFabrikUI.access$0(AdminNeueFabrikUI.java:230)
    at ourProject.client.UI.admin.fabrik.AdminNeueFabrikUI$1.onSelection(AdminNeueFabrikUI.java:77)
    at com.google.gwt.event.logical.shared.SelectionEvent.dispatch(SelectionEvent.java:89)
    at com.google.gwt.event.logical.shared.SelectionEvent.dispatch(SelectionEvent.java:1)
    at com.google.gwt.event.shared.HandlerManager$HandlerRegistry.fireEvent(HandlerManager.java:65)
    at com.google.gwt.event.shared.HandlerManager$HandlerRegistry.access$1(HandlerManager.java:53)
    at com.google.gwt.event.shared.HandlerManager.fireEvent(HandlerManager.java:178)
    at com.google.gwt.user.client.ui.Widget.fireEvent(Widget.java:52)
    at com.google.gwt.event.logical.shared.SelectionEvent.fire(SelectionEvent.java:43)
    at com.google.gwt.user.client.ui.TabPanel.onTabSelected(TabPanel.java:383)
    at com.google.gwt.user.client.ui.ListenerWrapper$WrappedTabListener.onSelection(ListenerWrapper.java:754)
    at com.google.gwt.event.logical.shared.SelectionEvent.dispatch(SelectionEvent.java:89)
    at com.google.gwt.event.logical.shared.SelectionEvent.dispatch(SelectionEvent.java:1)
    at com.google.gwt.event.shared.HandlerManager$HandlerRegistry.fireEvent(HandlerManager.java:65)
    at com.google.gwt.event.shared.HandlerManager$HandlerRegistry.access$1(HandlerManager.java:53)
    at com.google.gwt.event.shared.HandlerManager.fireEvent(HandlerManager.java:178)
    at com.google.gwt.user.client.ui.Widget.fireEvent(Widget.java:52)
    at com.google.gwt.event.logical.shared.SelectionEvent.fire(SelectionEvent.java:43)
    at com.google.gwt.user.client.ui.TabBar.selectTab(TabBar.java:462)
    at com.google.gwt.user.client.ui.TabBar.selectTabByTabWidget(TabBar.java:601)
    at com.google.gwt.user.client.ui.TabBar.access$0(TabBar.java:596)
    at com.google.gwt.user.client.ui.TabBar$ClickDelegatePanel.onBrowserEvent(TabBar.java:151)
    at com.google.gwt.user.client.DOM.dispatchEventImpl(DOM.java:1307)
    at com.google.gwt.user.client.DOM.dispatchEvent(DOM.java:1263)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157)
    at com.google.gwt.dev.shell.BrowserChannel.reactToMessagesWhileWaitingForReturn(BrowserChannel.java:1714)
    at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:165)
    at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:120)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:507)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:264)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
    at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
    at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:188)
    at sun.reflect.GeneratedMethodAccessor61.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:157)
    at com.google.gwt.dev.shell.BrowserChannel.reactToMessages(BrowserChannel.java:1669)
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:401)
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:222)
    at java.lang.Thread.run(Unknown Source)
```

Und dies ist die Klasse Container:


```
package ourProject.client.ArbeitsKlassen;

public class Container<T> {
	public T data;
	
	public T getData() {
		return data;
	}
	public void setData(T data) {
		this.data = data;
	}

}
```

Kann es sein das die Liste irgendwie verloren geht wenn ich diese im Container Speichere?


----------



## computersport (7. Sep 2010)

SlaterB hat gesagt.:


> select * from richtigerTabellenname
> 
> ich frage mich wie du dann auf anderen Wege festgestellt hast, ob etwas in der Tabelle drin ist



Ganz einfach ich hab das Perspective "Database Development" von Eclipse angeklickt mich zur datenbank verbunden und dann eine Sample Content der entsprechenden Tabelle geben lassen.


----------



## SlaterB (7. Sep 2010)

nicht kompliziert denken, stattdessen einfach denken, 
viel logischer ist doch, dass 
> container.setData(result);
gar nicht erst ausgeführt wird, und das gehört geloggt

wie viel einfacher wäre alles, wenn du nur die simpelsten Befehle hinschreiben würdest, die es gibt:

> System.out.println("speichere result in container: "+result);
> container.setData(result);


> List<DTOFabrik> result = container.getData();
> System.out.println("verwende gleich result aus container: "+result);
> GWT.log(result.get(1).getName());


----------



## computersport (7. Sep 2010)

Also das Loggen werd ich mir zu herzen nehmen erspart einem eine Menge arbeit.

Also innerhalb der Methode onSuccess wird result geloggt.

Jedoch wird nicht "verwende gleich result aus container: " nicht angezeigt....
Die Exception zeigt auf den punkt wo ich mir die Daten mit Container.getData() hole.


----------



## SlaterB (7. Sep 2010)

eine andere Exception als vorher bzw. andere Position?
oder wird nur die Anzeige minimal verschoben weil du weiter oben eine neue Zeile eingefügt hast?
füge noch mehr Leerzeilen ein, verschiebe den Code gar testweise eine neue Untermethode ganz woanders hin,
genau testen wer wem einen Streich spielt

container auf null zu loggen ist fast überflüssig, da es eine finale Variable ist, dennoch besser tun


----------



## computersport (7. Sep 2010)

Ich hab das befüllen der Listbox jetzt direkt in der onSuccess methode gemacht und jetzt klappt es, bloß warum klammt es sonst nicht.....


```
private void getFarbiken() {
		FabrikServiceAsync service = (FabrikServiceAsync) GWT.create(FabrikService.class);
		ServiceDefTarget servicedef = (ServiceDefTarget) service;
		servicedef.setServiceEntryPoint(GWT.getModuleBaseURL() + "fabrik");
		
		AsyncCallback<List<DTOFabrik>> callback = new AsyncCallback<List<DTOFabrik>>() {
			
			@Override
			public void onSuccess(List<DTOFabrik> result) {
				List<DTOFabrik> dtofabrikliste = result;
				Object[] elements = dtofabrikliste.toArray();
				for(int i = 0; i < dtofabrikliste.size(); i++) {
					DTOFabrik dto = (DTOFabrik) elements[i];
					listboxAuswahl.addItem(dto.getName());
				}
			}
			
			@Override
			public void onFailure(Throwable caught) {
				
			}
		};
		System.out.println("vor dem Service");
		service.getFabrikListe(callback);
	}
```


----------



## SlaterB (7. Sep 2010)

was ich mit dem Logging eigentlich erreichen wollte ist wohl auch eingetreten, nur ist es nicht so leicht zu interpretieren 
und ich selber habe auch nicht mehr genau genug daran gedacht,

das Problem ist wahrscheinlich, dass der Code mit
> GWT.log(result.get(1).getName());
VOR dem Aufruf der Methode im AsyncCallback stattfindet,
deswegen heißt es sicher AsyncCallback, weil es kein direkter Callback ist sondern ein wenig dauert,

du müsstest also erst die Ausgabe
> "verwende gleich result aus container: "+result
erhalten, dann den vielen Text durch die Exception, dann später 
> "speichere result in container: "+result

dass du das so nicht in der Anzeige vorliegen hast, kann daran liegen, dass Fehler in System.err geschrieben werden und Ausgaben in System.out,
diese beiden Streams werden mehr oder wieder durcheinanders ausgegeben,
deswegen 'speichere'-Ausgabe vor der Exception und 'verwende' nicht zu erkennen weil das wer weiß wo steht,
vor nach, zwischen der langem Exception-Ausgabe, Text-Suche hilft vielleicht

Möglichkeiten das deutlicher zu machen:
- System.err.println() statt System.out.println() verwenden,
- mit Thread.sleep(); längere Pausen zwischen den Befehlen/ Ausgaben durchführen
- aktuelle Zeit mitloggen
- einen professionellen Logger verwenden

-------

zum Problem hast du wahrscheinlich schon die optimale Lösung gewählt, die Verarbeitung sollte in den AsyncCallback,
oder Thread.sleep() kann helfen, warten bis AsyncCallback fertig ist


----------



## computersport (7. Sep 2010)

Danke das hat jetzt endlich Licht in das ganze bringen...
Ehm was versteht du unter einem professionellen Logger?
Ich bin da nich so bewandert....


----------



## SlaterB (7. Sep 2010)

siehe z.B.
Java Logging API - Tutorial
oder google

an solche Logger kann man neben Text auch Exceptions (Throwable) übergeben,
gibt verschiedene Frameworks


----------



## computersport (7. Sep 2010)

SlaterB hat gesagt.:


> was ich mit dem Logging eigentlich erreichen wollte ist wohl auch eingetreten, nur ist es nicht so leicht zu interpretieren
> und ich selber habe auch nicht mehr genau genug daran gedacht,
> 
> das Problem ist wahrscheinlich, dass der Code mit
> ...




Betreffend "Thread.sleep()" hab ich mich ein bisschen schlau gemacht und glaube das dies in GWT an sich nicht möglich ist. Hier ein Link wo darauf eingegangen wird. Ist aber auf Englisch.
Für alle die evtl. das gleiche Problem haben.

My RPC won't work AKA That's not Async - Google Web Toolkit | Google Groups

Ich hoffe ich konnte helfen.


----------

