Hibernate Ungültiger Spaltentyp: getBLOB not implemented for class oracle.jdbc.driver.T4CRawAccessor

Barb

Mitglied
Hallo zusammen,

beim Ausführen eines SELECT über Hibernate bekomme ich folgende Fehlermelung:

Code:
org.hibernate.exception.GenericJDBCException: Ungültiger Spaltentyp: getBLOB not implemented for class oracle.jdbc.driver.T4CRawAccessor
	at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
	at org.hibernate.engine.jdbc.internal.proxy.AbstractResultSetProxyHandler.continueInvocation(AbstractResultSetProxyHandler.java:108)
	at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
	at $Proxy59.getBlob(Unknown Source)
	at org.hibernate.type.descriptor.sql.BlobTypeDescriptor$5.doExtract(BlobTypeDescriptor.java:118)
	at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:65)
	at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:269)
	at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:265)
	at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:238)
	at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:357)
	at org.hibernate.loader.Loader.extractKeysFromResultSet(Loader.java:706)
	at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:639)
	at org.hibernate.loader.Loader.doQuery(Loader.java:854)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:293)
	at org.hibernate.loader.Loader.doList(Loader.java:2382)
	at org.hibernate.loader.Loader.doList(Loader.java:2368)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2198)
	at org.hibernate.loader.Loader.list(Loader.java:2193)
	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470)
	at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355)
	at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195)
	at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1244)
	at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
	at de.my.myproject.facade.MandantFacade.findByMandant(MandantFacade.java:27)
	at de.my.myproject.bl.dataservice.MandantDataService.findByMandant(MandantDataService.java:17)
	at de.my.myproject.server.MandantServiceImpl.findByMandant(MandantServiceImpl.java:57)
	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)
	at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
	at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
	at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:688)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:770)
	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.Server.handle(Server.java:324)
	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)

Meine Klasse sieht folgendermaßen aus:

Java:
package de.my.myproject.facade;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import de.my.myproject.entities.Mandant;
import de.my.myproject.facade.base.FacadeBase;

public class MandantFacade extends FacadeBase<byte[], Mandant> {

	public MandantFacade() {
		this.entityClass = Mandant.class;
	}
	
	@SuppressWarnings("unchecked")
	public List<Mandant> findByMandant(String mandant) {
		try {
			Session s = getSessionFactory().openSession();
			
			Transaction t = s.beginTransaction();
			Query q = s.createQuery("FROM " + entityClass.getName() + " WHERE mandant=:mandant");
			q.setString("mandant", mandant);
			t.commit();
			List<Mandant> instance = q.list();
			
			return instance;
		} catch (RuntimeException re) {
			re.printStackTrace();
			throw re;
		}
	}
}

Vielen Dank. :)
 
Zuletzt bearbeitet von einem Moderator:
N

nillehammer

Gast
Da er ein Blob anmeckert, scheint dashier:
Java:
extends FacadeBase<byte[], Mandant>
wichtig zu sein. Wie sieht die FacadeBase-Klasse aus? Wie sieht das Mapping von Mandant aus?

Die Transaction ist überflüssig.

Der Query-String ist nicht valide. Es fehlt das "SELECT"
 

Barb

Mitglied
Hallo nillehammer,

FacadeBase sieht folgendermaßen aus:

Java:
package de.my.myproject.facade.base;

import java.util.List;

import org.hibernate.LockMode;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Example;

@SuppressWarnings("deprecation")
public abstract class FacadeBase<K, E> {

	protected Class<E> entityClass;

	private static SessionFactory sessionFactory = null;

	protected static SessionFactory getSessionFactory() {
		try {
			
			if(sessionFactory == null) {
				sessionFactory = new  Configuration().configure("/hibernate.cfg.xml").buildSessionFactory();
			}
			return sessionFactory;
			
		} catch (Exception e) {
			String message = "SessionFactory kann nicht erstellt werden!";
			e.printStackTrace();
			throw new IllegalStateException(message);
		}
	}

	public void persist(E transientInstance) {
		try {
			sessionFactory.getCurrentSession().persist(transientInstance);
		} catch (RuntimeException re) {
			re.printStackTrace();
			throw re;
		}
	}

	public void attachDirty(E instance) {
		try {
			sessionFactory.getCurrentSession().saveOrUpdate(instance);
		} catch (RuntimeException re) {
			re.printStackTrace();
			throw re;
		}
	}

	public void attachClean(E instance) {
		try {
			sessionFactory.getCurrentSession().lock(instance, LockMode.NONE);
		} catch (RuntimeException re) {
			re.printStackTrace();
			throw re;
		}
	}

	public void delete(E persistentInstance) {
		try {
			sessionFactory.getCurrentSession().delete(persistentInstance);
		} catch (RuntimeException re) {
			re.printStackTrace();
			throw re;
		}
	}

	public E merge(E detachedInstance) {
		try {
			@SuppressWarnings("unchecked")
			E result = (E) sessionFactory.getCurrentSession().merge(detachedInstance);
			return result;
		} catch (RuntimeException re) {
			re.printStackTrace();
			throw re;
		}
	}

	public E findById(byte[] id) {
		try {
			@SuppressWarnings("unchecked")
			E instance = (E) sessionFactory.getCurrentSession().get(entityClass.getName(), id);
			return instance;
		} catch (RuntimeException re) {
			re.printStackTrace();
			throw re;
		}
	}
	

	public List<E> findByExample(E instance) {
		try {
			@SuppressWarnings("unchecked")
			List<E> results = sessionFactory.getCurrentSession().createCriteria(entityClass.getName()).add(Example.create(instance)).list();
			return results;
		} catch (RuntimeException re) {
			re.printStackTrace();
			throw re;
		}
	}
}

Mandant sieht folgendermaßen aus (das Binding erfolgt über Annotation):

Java:
package de.my.myproject.entities;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
@Table(name = "MANDANT", catalog = "", schema = "JOWI")
public class Mandant implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Lob
    @Column(name = "GUID", nullable = false)
    private byte[] guid;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 8)
    @Column(name = "MANDANT", nullable = false, length = 8)
    private String mandant;
    @Size(max = 128)
    @Column(name = "BESCHREIBUNG", length = 128)
    private String beschreibung;

    public Mandant() {
    }

    public Mandant(byte[] guid) {
        this.guid = guid;
    }

    public Mandant(byte[] guid, String mandant) {
        this.guid = guid;
        this.mandant = mandant;
    }

    public byte[] getGuid() {
        return guid;
    }

    public void setGuid(byte[] guid) {
        this.guid = guid;
    }

    public String getMandant() {
        return mandant;
    }

    public void setMandant(String mandant) {
        this.mandant = mandant;
    }

    public String getBeschreibung() {
        return beschreibung;
    }

    public void setBeschreibung(String beschreibung) {
        this.beschreibung = beschreibung;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (guid != null ? guid.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof Mandant)) {
            return false;
        }
        Mandant other = (Mandant) object;
        if ((this.guid == null && other.guid != null) || (this.guid != null && !this.guid.equals(other.guid))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "de.my.myproject.entities.Mandant[ guid=" + guid + " ]";
    }
}

Vielen Dank für Deine Hilfe. :)
 

Barb

Mitglied
Habe die hibernate.cfg.xml geändert:
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.password">mypassword</property>
<property name="hibernate.connection.url">jdbc:eek:racle:thin:mad:myserver:1521:XE</property>
<property name="hibernate.connection.username">myuser</property>
<property name="hibernate.default_catalog">mydatabase</property>
<property name="hibernate.default_schema">MYSCHEMA</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="hibernate.show_sql">true</property>
<mapping class="de.my.myproject.entities.Mandant"/>
</session-factory>
</hibernate-configuration>
[/XML]

Java:
package de.my.myproject.facade;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import de.my.myproject.entities.Mandant;
import de.my.myproject.facade.base.FacadeBase;

public class MandantFacade extends FacadeBase<byte[], Mandant> {

	public MandantFacade() {
		this.entityClass = Mandant.class;
	}
	
	@SuppressWarnings("unchecked")
	public List<Mandant> findByMandant(String mandant) {
		try {
			Session s = getSessionFactory().openSession();
			
			Query q = s.createQuery("SELECT m FROM " + entityClass.getName() + " m WHERE m.mandant= :mandant");
			q.setString("mandant", mandant);
			List<Mandant> instance = q.list();
			
			return instance;
		} catch (RuntimeException re) {
			re.printStackTrace();
			throw re;
		}
	}
}

Und bekomme jetzt folgenden Fehler:
Code:
ORA-00933: SQL command not properly ended
;(
 
S

SlaterB

Gast
> <property name="hibernate.show_sql">true</property>
hast du konfiguriert, gibt es auch SQL-Kommandos in irgendeinem Log zu sehen?

lasse in der Klasse Mandant komplizierte Attribute wie byte[] vorerst lieber weg, so simpel wie möglich beginnen nur mit einer Id,
oder sind Grundlagen alle klar und funktioniert es ohne byte[] und geht es nur um dieses komplexe Erweiterung?

-----

> Query q = s.createQuery("FROM " + entityClass.getName() + " WHERE mandant=:mandant");
funktioniert in Hibernate, HQL, durchaus ohne SELECT,

wenn du schon Mandant-Spalten einzeln schreibst, dann könntest du auch den Klassenname ruhig genauso explizit nennen:

Query q = s.createQuery("FROM Mandant WHERE mandant=:mandant");
 

Barb

Mitglied
Hallo SlaterB,

danke für Deine Antwort. Das Problem stellte [XML]<property name="hibernate.default_catalog">mydatabase</property>[/XML] dar. Durch Entfernen dieser Property läuft es auf dem Server.

Jedoch werden die Daten noch nicht angezeigt. Ich werd noch irre. ;(

Mein Controller sieht wie folgt aus:

Java:
package de.my.myproject.client.controller;

import java.util.List;

import com.google.gwt.event.shared.HandlerManager;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.data.RecordList;

import de.my.myproject.client.service.MandantServiceAsync;
import de.my.myproject.client.views.MandantView;
import de.my.myproject.entities.Mandant;

public class MandantController {

	private HandlerManager eventBus;
	private MandantServiceAsync service;
	public MandantView view;

	public MandantController(HandlerManager eventBus) {
		this.eventBus = eventBus;
		this.view = new MandantView(this);
		this.service = MandantServiceAsync.Util.getInstance();
	}

	public void search(Mandant mandant) {
		service.findByMandant(mandant.getBeschreibung(), new AsyncCallback<List<Mandant>>() {
					@Override
					public void onFailure(Throwable caught) {
						view.setErrorMessage(caught.toString());
					}

					@Override
					public void onSuccess(List<Mandant> result) {
						if (result != null) {
							RecordList data = new RecordList();

							for (Mandant item : result) {
								Record record = new Record();
								record.setAttribute("GUID", item.getGuid());
								record.setAttribute("MANDANT", item.getMandant());
								record.setAttribute("BESCHREIBUNG", item.getBeschreibung());
								data.add(record);
							}

							view.refreshData(data);
						}
					}
				});
	}
}

Vielen Dank. :)
 
S

SlaterB

Gast
also ich hoffe das ist keine Frage, dein neuer Code hat nur wenig Aussage,
die findByMandant()-Methode wird wohl aufgerufen, aber mit welchem Parameter ist unbekannt,
was in der DB drinsteht ist unbekannt usw.

frage für den Anfang lieber die ganze Tabelle ab
Java:
Query q = s.createQuery("FROM Mandant");
dann sparst du dir Probleme eines falschen WHERE-Arguments


ob was zurückkommt, würde ich lieber gleich in findByMandant() loggen,
als über obskure Wege AsyncCallback, Data in irgendeiner GUI usw...

vor jedem höheren Programm steht immer erst ein System.out.println() ;)
 
Zuletzt bearbeitet von einem Moderator:

Barb

Mitglied
Hallo SlaterB,

habe jetzt
SQL:
FROM Mandant
abgefragt und bekomme wieder
Code:
Ungültiger Spaltentyp: getBLOB not implemented for class oracle.jdbc.driver.T4CRawAccessor
;(

Das darf doch nicht wahr sein. Ich drehe mich eim Kreis.
 
S

SlaterB

Gast
wirf byte[] raus, fange evtl. sogar auf DB-Seite mit unverfänglichen Tabellen an, dann wird ja wohl dieser Fehler nicht kommen,
kann sein dass zwischendurch kein solcher Fehler kam weil andere oder schlicht keine Daten geladen wurden,

mit Blob stehst du also nach wie vor am Anfang, helfen kann ich dazu nicht besonders,
abgesehen von allgemeinen Hinweis:
'getBLOB not implemented for class oracle.jdbc.driver.T4CRawAccessor' in Suchmaschinen eintippen
 

Barb

Mitglied
Habe in ORACLE von byte[] auf Int gerändert, jedoch ist der Fehler immer noch da. ;(

Habe bereits gesucht und ohne Erfolg, deshalb habe ich die Frage erst gepostet. ;)
 
S

SlaterB

Gast
hast du in der Klasse auch das byte[] entfernt?
wiederum die Frage: hast du überhaupt je mit dieser Konstellation, diese DB und dieses Hibernate schon erfolgreich ein Objekt geladen?
mit byte[] fängt man nicht gerade an

in allen Zweifeln beginne ein komplett neues Projekt dazu, eine neue Datenbank (dieses Types), mit einer Dummy-Tabelle, eine neue Java-Klasse mit passenden Mapping usw.,
nirgendwo darf der Hauch eines Anscheins von byte[] in irgendeiner Historie/ Erinnerung auch nur als Wasserzeichen durchscheinen ;)

wenn auch dann diese ominöse Fehlermeldung kommt, kann ich freilich nicht weiterhelfen,

ansonsten hoffe ich mal dass es allgemein funktioniert, nur mit expliziter Verwendung von byte[]/ Blob Probleme,
(bei denen ich auch wiederum nicht weiterhelfen kann..)

in jedem Fall vielleicht andere Hibernate-Versionen/ Treiber/ andere DB testen,
um es auch einmal hingeschrieben zu haben, kann man sich natürlich immer denken,
ok, Hibernate gibts wohl nur in einer Variante, die aktuelle..

edit:
immerhin, ein Anfang
 

Oben