Interpreter-Fehler ClassCastException wird bei Schleifenaufruf geworfen

Fabulus

Mitglied
Hallo Community,

ich habe hier folgenden Code:
Java:
@Override
	public List<MarkerDTO> getMarkers() {
		
		Session session = HibernateUtil.getSessionFactory().openSession();
		Transaction transaction = null;
		
		List<MarkerDTO> markerDTOs = null;
		try {
			
			transaction = session.beginTransaction();
			
			@SuppressWarnings("unchecked")
			List<Marker> marker = new ArrayList<Marker>(
					session.createSQLQuery("SELECT * FROM MARKER").list());
			
			markerDTOs = new ArrayList<MarkerDTO>(
					marker != null ? marker.size() : 0);
			
			if(marker != null ) {
				for(Marker m : marker) {
					markerDTOs.add(createMarkerDTO(m));
				}
			}
			
			transaction.commit();
			
		} catch(HibernateException e) {
			transaction.rollback();
			Window.alert(e.getMessage());
			markerDTOs = new ArrayList<MarkerDTO>(0);
		} finally {
			session.close();
		}
		
		return markerDTOs;
	}

Die Methode ist eine Methode in einer ServiceImpl-Klasse bei einem Datenbankaufruf mit Hibernate in Verbindung mit GWT.

In der Zeile
Java:
for(Marker m : marker) {
wird eine ClassCastException geworfen.
Marker und MarkerDTO sind zwei von mir geschrieben Klassen im package com.lumbeck.domain (Marker) und com.lumbeck.client.dto (MarkerDTO).

Ich halte mich dabei an dieses Tutorial und habe die Klassen analog übertragen.

Die Exception ist:
Code:
 java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.lumbeck.domain.Marker
	at com.lumbeck.server.MapsServiceImpl.getMarkers(MapsServiceImpl.java:121)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569)
	... 21 more

Jemand Ideen, warum die Exception geworfen wird?
 
Zuletzt bearbeitet von einem Moderator:
Ah ok, mein Objekt Marker besteht aus zwei Attributen vom Datentyp java.lang.Long und com.lumbeck.domain.Punkt, dann müsste ich beim SQL-Statement noch ein .addEntity(Punkt.class) und .addEntity(Long.class) anhängen? (Wenn ich es richtig verstehe, was hier steht: Chapter 16. Native SQL )
 
Am besten wäre es, wenn du für deine Marker-Klasse ein vernünftiges Hibernate-Mapping schreibst und dann die Criteria-API verwendest.
 
Ah, die Criteria API kannte ich noch nicht!
Die Marker- und Punkt-Klassen habe ich mir mit dem Hibernate Tool erstellen lassen, habe vorher die hbm.xml-Datei dazu geschrieben.

Um das Ganze noch einfacher zu machen, möchte ich jetzt einfach mal alle Objekte der Klasse "Punkt" von mir aus der Tabelle holen (es ist bisher 1 Reihe in der Tabelle vorhanden)

Die Klasse Punkt hatte folgendes Mapping:
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 15.02.2012 08:18:11 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.lumbeck.domain.Punkt" table="PUNKT">
        <id name="id" type="java.lang.Long">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="longitude" type="double">
            <column name="LONGITUDE" />
        </property>
        <property name="latitude" type="double">
            <column name="LATITUDE" />
        </property>
    </class>
</hibernate-mapping>

So, und mit einer Criteria möchte ich nun diese Punkte aus der DB holen.

Das habe ich mit
Java:
			Criteria crit = session.createCriteria(Punkt.class);
			List<Punkt> punkte = crit.list();

gemacht, die Liste ist aber dennoch leer.
Ich habe die SQL-Ausgabe in der Konfiguration aktiviert, die Ausgabe ist:
Code:
Hibernate: select this_.ID as ID1_0_, this_.LONGITUDE as LONGITUDE1_0_, this_.LATITUDE as LATITUDE1_0_ from PUNKT this_

Ah eine Frage dazu dann auch: Muss ich den dialect ändern bzw hat das irgendwas damit zu tun? Momentan steht der auf MySQL-dialect, weil ich eine MySQL-DB benutze.
 
Zuletzt bearbeitet:
Dann versteh ich nicht, warum eine leere Liste zurück kommt. Wenn es keine Exceptions gibt und die SQL-Query korrekt ist, sollte es eigentlich klappen.
 
Hm, komisch, Habe mal mit phpMyAdmin manuell eine Reihe hinzugefügt und die kann geladen werden. Stimmt wohl was beim Speichern nicht ganz.

Es war übrigens mein Fehler, ich habe eben den Tomcat-Server neugestartet und danach waren anscheinend die Tabellen nicht mehr da, warum auch immer...

Edit:
property "hbm2ddl.auto" stand auf create, das bedeutet, bei jedem Applikationsstart werden die Tabellen neu erstellt?
 
Zuletzt bearbeitet:

Zurück
Oben