Hallo
Ich habe die Aufgabe, einen einfachen Webshop in Java zu implementieren. Dafür verwende ich eine Oracle10 Datenbank, Hibernate, Struts und Tomcat. Ich arbeite unter Eclipse. Unter anderem habe ich eine Tabelle "Item" mit folgendem SQL statement erstellt:
Daraus habe ich die persistent Class "Item" und die Datei "item.hbm.xml" für die Definition der Mappings automatisch erstellen lassen, diese sehen wie folgt aus:
Item.java:
Item.hbm.xml
Meine Hibernate Config Datei sieht wie folgt aus:
Nun wollte ich mit einer HQL Abfrage alle items in der Tabelle abfragen:
Bei der Abfrage kommt es zu einer SerializationException, ich erhalte dabei folgenden Log:
Wie man bei der Log-Zeile
12:47:40,866 INFO SerializableType:132 - could not read column value from result set: PREIS4_
sieht, liegt das Problem wohl in der Tabellenspalte PREIS die in der Datenbank als Float angelegt wurde und die gemappt wurde mit:
<property name="preis" type="serializable">
<column name="PREIS" not-null="true" />
</property>
Entsprechend der Datentyp Serializable für die Variable "preis" in der Item Klasse. Ich habe schon versucht, die Tabellenspalte stattdessen auf einen String oder ein java.lang.Float zu mappen, aber die Fehlermeldung bleibt dieselbe. Für Hinweise oder Lösungsvorschläge zu diesem Problem wäre ich dankbar.
EDIT: Das Problem hat sich erledigt, das Mapping auf "serializable" scheint ein Bug in bestimmten Hibernate versionen zu sein. Ich kann das property stattdessen auf Float mappen, allerdings war es falsch auf java.lang.Float zu mappen. Der richtige Eintrag für die Property lautet:
type="float"
und in der Java Klasse musste anschließend "Serializable" durch Float ersetzt werden, dann funktioniert es.
Ich habe die Aufgabe, einen einfachen Webshop in Java zu implementieren. Dafür verwende ich eine Oracle10 Datenbank, Hibernate, Struts und Tomcat. Ich arbeite unter Eclipse. Unter anderem habe ich eine Tabelle "Item" mit folgendem SQL statement erstellt:
Code:
CREATE TABLE Item (
IID integer not null,
Bezeichnung varchar(40) not null,
Preis float not null,
Menge integer not null,
Beschreibung long,
Thumbnail varchar(255),
KID integer not null,
Bild varchar(255),
Steuerklasse integer not null,
primary key (IID)
)
Daraus habe ich die persistent Class "Item" und die Datei "item.hbm.xml" für die Definition der Mappings automatisch erstellen lassen, diese sehen wie folgt aus:
Item.java:
Code:
package vislabExample.model.db;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* Item generated by hbm2java
*/
public class Item implements java.io.Serializable {
// Fields
/**
*
*/
private static final long serialVersionUID = -3914387285584940503L;
private BigDecimal iid;
private String bezeichnung;
private Serializable preis;
private BigDecimal menge;
private String beschreibung;
private String thumbnail;
private BigDecimal kid;
private String bild;
private BigDecimal steuerklasse;
//private Steuerklasse steuerklasse_object;
//private Kategorie kategorie_object;
// Constructors
/** default constructor */
public Item() {
}
/** minimal constructor */
public Item(BigDecimal iid, String bezeichnung, Serializable preis, BigDecimal menge, BigDecimal kid, BigDecimal steuerklasse) {
this.iid = iid;
this.bezeichnung = bezeichnung;
this.preis = preis;
this.menge = menge;
this.kid = kid;
this.steuerklasse = steuerklasse;
}
/** full constructor */
public Item(BigDecimal iid, String bezeichnung, Serializable preis, BigDecimal menge, String beschreibung, String thumbnail, BigDecimal kid, String bild, BigDecimal steuerklasse) {
this.iid = iid;
this.bezeichnung = bezeichnung;
this.preis = preis;
this.menge = menge;
this.beschreibung = beschreibung;
this.thumbnail = thumbnail;
this.kid = kid;
this.bild = bild;
this.steuerklasse = steuerklasse;
}
// Property accessors
public BigDecimal getIid() {
return this.iid;
}
public void setIid(BigDecimal iid) {
this.iid = iid;
}
public String getBezeichnung() {
return this.bezeichnung;
}
public void setBezeichnung(String bezeichnung) {
this.bezeichnung = bezeichnung;
}
public Serializable getPreis() {
return this.preis;
}
public void setPreis(Serializable preis) {
this.preis = preis;
}
public BigDecimal getMenge() {
return this.menge;
}
public void setMenge(BigDecimal menge) {
this.menge = menge;
}
public String getBeschreibung() {
return this.beschreibung;
}
public void setBeschreibung(String beschreibung) {
this.beschreibung = beschreibung;
}
public String getThumbnail() {
return this.thumbnail;
}
public void setThumbnail(String thumbnail) {
this.thumbnail = thumbnail;
}
public BigDecimal getKid() {
return this.kid;
}
public void setKid(BigDecimal kid) {
this.kid = kid;
}
public String getBild() {
return this.bild;
}
public void setBild(String bild) {
this.bild = bild;
}
public BigDecimal getSteuerklasse() {
return this.steuerklasse;
}
public void setSteuerklasse(BigDecimal steuerklasse) {
this.steuerklasse = steuerklasse;
}
}
Item.hbm.xml
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 05.11.2007 11:28:13 by Hibernate Tools 3.1.0.beta4 -->
<hibernate-mapping>
<class name="vislabExample.model.db.Item" table="ITEM">
<id name="iid" type="big_decimal">
<column name="IID" precision="22" scale="0" />
<generator class="increment" />
</id>
<property name="bezeichnung" type="string">
<column name="BEZEICHNUNG" length="40" not-null="true" />
</property>
<property name="preis" type="serializable">
<column name="PREIS" not-null="true" />
</property>
<property name="menge" type="big_decimal">
<column name="MENGE" precision="22" scale="0" not-null="true" />
</property>
<property name="beschreibung" type="string">
<column name="BESCHREIBUNG" length="0" />
</property>
<property name="thumbnail" type="string">
<column name="THUMBNAIL" />
</property>
<property name="kid" type="big_decimal">
<column name="KID" precision="22" scale="0" not-null="true" />
</property>
<property name="bild" type="string">
<column name="BILD" />
</property>
<property name="steuerklasse" type="big_decimal">
<column name="STEUERKLASSE" precision="22" scale="0" not-null="true" />
</property>
</class>
</hibernate-mapping>
Meine Hibernate Config Datei sieht wie folgt aus:
Code:
<?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.cglib.use_reflection_optimizer">true</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.password">VISLAB15</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@i-lkit-db-01:1521:LAB1</property>
<property name="hibernate.connection.username">VISLAB15</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.default_schema">VISLAB15</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.show_sql">true</property>
<mapping resource="vislabExample/model/db/Kategorie.hbm.xml" />
<mapping resource="vislabExample/model/db/Steuerklasse.hbm.xml" />
<mapping resource="vislabExample/model/db/Rollen.hbm.xml" />
<mapping resource="vislabExample/model/db/Rolle.hbm.xml" />
<mapping resource="vislabExample/model/db/Item.hbm.xml" />
<mapping resource="vislabExample/model/db/Bestellung.hbm.xml" />
<mapping resource="vislabExample/model/db/Benutzer.hbm.xml" />
</session-factory>
</hibernate-configuration>
Nun wollte ich mit einer HQL Abfrage alle items in der Tabelle abfragen:
Code:
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
List allItem = session.createQuery("from Item").list();
session.getTransaction().commit();
return allItem;
Bei der Abfrage kommt es zu einer SerializationException, ich erhalte dabei folgenden Log:
Code:
12:47:40,803 DEBUG SessionImpl:977 - find: from Item
12:47:40,803 DEBUG QueryParameters:261 - named parameters: {}
12:47:40,803 DEBUG QueryTranslatorImpl:232 - parse() - HQL: from vislabExample.model.db.Item
12:47:40,803 DEBUG AST:248 - --- HQL AST ---
\-[QUERY] 'query'
\-[SELECT_FROM] 'SELECT_FROM'
\-[FROM] 'from'
\-[RANGE] 'RANGE'
\-[DOT] '.'
+-[DOT] '.'
| +-[DOT] '.'
| | +-[IDENT] 'vislabExample'
| | \-[IDENT] 'model'
| \-[IDENT] 'db'
\-[IDENT] 'Item'
12:47:40,803 DEBUG ErrorCounter:68 - throwQueryException() : no errors
12:47:40,803 DEBUG HqlSqlBaseWalker:111 - select << begin [level=1, statement=select]
12:47:40,803 DEBUG FromElement:104 - FromClause{level=1} : vislabExample.model.db.Item (no alias) -> item0_
12:47:40,803 DEBUG HqlSqlBaseWalker:117 - select : finishing up [level=1, statement=select]
12:47:40,803 DEBUG HqlSqlWalker:443 - processQuery() : ( SELECT ( FromClause{level=1} VISLAB15.ITEM item0_ ) )
12:47:40,819 DEBUG HqlSqlWalker:612 - Derived SELECT clause created.
12:47:40,819 DEBUG JoinProcessor:128 - Using FROM fragment [VISLAB15.ITEM item0_]
12:47:40,819 DEBUG HqlSqlBaseWalker:123 - select >> end [level=1, statement=select]
12:47:40,819 DEBUG AST:218 - --- SQL AST ---
\-[SELECT] QueryNode: 'SELECT' querySpaces (VISLAB15.ITEM)
+-[SELECT_CLAUSE] SelectClause: '{derived select clause}'
| +-[SELECT_EXPR] SelectExpressionImpl: 'item0_.IID as IID4_' {FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=null,role=null,tableName=VISLAB15.ITEM,tableAlias=item0_,origin=null,colums={,className=vislabExample.model.db.Item}}}
| \-[SQL_TOKEN] SqlFragment: 'item0_.BEZEICHNUNG as BEZEICHN2_4_, item0_.PREIS as PREIS4_, item0_.MENGE as MENGE4_, item0_.BESCHREIBUNG as BESCHREI5_4_, item0_.THUMBNAIL as THUMBNAIL4_, item0_.KID as KID4_, item0_.BILD as BILD4_, item0_.STEUERKLASSE as STEUERKL9_4_'
\-[FROM] FromClause: 'from' FromClause{level=1, fromElementCounter=1, fromElements=1, fromElementByClassAlias=[], fromElementByTableAlias=[item0_], fromElementsByPath=[], collectionJoinFromElementsByPath=[], impliedElements=[]}
\-[FROM_FRAGMENT] FromElement: 'VISLAB15.ITEM item0_' FromElement{explicit,not a collection join,not a fetch join,fetch non-lazy properties,classAlias=null,role=null,tableName=VISLAB15.ITEM,tableAlias=item0_,origin=null,colums={,className=vislabExample.model.db.Item}}
12:47:40,819 DEBUG ErrorCounter:68 - throwQueryException() : no errors
12:47:40,819 DEBUG QueryTranslatorImpl:202 - HQL: from vislabExample.model.db.Item
12:47:40,819 DEBUG QueryTranslatorImpl:203 - SQL: select item0_.IID as IID4_, item0_.BEZEICHNUNG as BEZEICHN2_4_, item0_.PREIS as PREIS4_, item0_.MENGE as MENGE4_, item0_.BESCHREIBUNG as BESCHREI5_4_, item0_.THUMBNAIL as THUMBNAIL4_, item0_.KID as KID4_, item0_.BILD as BILD4_, item0_.STEUERKLASSE as STEUERKL9_4_ from VISLAB15.ITEM item0_
12:47:40,819 DEBUG ErrorCounter:68 - throwQueryException() : no errors
12:47:40,819 DEBUG AbstractBatcher:309 - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
12:47:40,819 DEBUG SQL:344 -
select
item0_.IID as IID4_,
item0_.BEZEICHNUNG as BEZEICHN2_4_,
item0_.PREIS as PREIS4_,
item0_.MENGE as MENGE4_,
item0_.BESCHREIBUNG as BESCHREI5_4_,
item0_.THUMBNAIL as THUMBNAIL4_,
item0_.KID as KID4_,
item0_.BILD as BILD4_,
item0_.STEUERKLASSE as STEUERKL9_4_
from
VISLAB15.ITEM item0_
Hibernate:
select
item0_.IID as IID4_,
item0_.BEZEICHNUNG as BEZEICHN2_4_,
item0_.PREIS as PREIS4_,
item0_.MENGE as MENGE4_,
item0_.BESCHREIBUNG as BESCHREI5_4_,
item0_.THUMBNAIL as THUMBNAIL4_,
item0_.KID as KID4_,
item0_.BILD as BILD4_,
item0_.STEUERKLASSE as STEUERKL9_4_
from
VISLAB15.ITEM item0_
12:47:40,819 DEBUG AbstractBatcher:413 - preparing statement
12:47:40,835 DEBUG AbstractBatcher:325 - about to open ResultSet (open ResultSets: 0, globally: 0)
12:47:40,835 DEBUG Loader:682 - processing result set
12:47:40,835 DEBUG Loader:687 - result set row: 0
12:47:40,835 DEBUG BigDecimalType:123 - returning '1' as column: IID4_
12:47:40,835 DEBUG Loader:1164 - result row: EntityKey[vislabExample.model.db.Item#1]
12:47:40,835 DEBUG Loader:1347 - Initializing object from ResultSet: [vislabExample.model.db.Item#1]
12:47:40,835 DEBUG AbstractEntityPersister:1859 - Hydrating entity: [vislabExample.model.db.Item#1]
12:47:40,850 DEBUG StringType:123 - returning 'Schuhschirm' as column: BEZEICHN2_4_
12:47:40,850 DEBUG SerializationHelper:198 - Starting deserialization of object
12:47:40,866 INFO SerializableType:132 - could not read column value from result set: PREIS4_
12:47:40,866 DEBUG AbstractBatcher:332 - about to close ResultSet (open ResultSets: 1, globally: 1)
12:47:40,866 DEBUG AbstractBatcher:317 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
12:47:40,866 DEBUG AbstractBatcher:459 - closing statement
12:47:40,882 WARN RequestProcessor:528 - Unhandled Exception thrown: class org.hibernate.type.SerializationException
Wie man bei der Log-Zeile
12:47:40,866 INFO SerializableType:132 - could not read column value from result set: PREIS4_
sieht, liegt das Problem wohl in der Tabellenspalte PREIS die in der Datenbank als Float angelegt wurde und die gemappt wurde mit:
<property name="preis" type="serializable">
<column name="PREIS" not-null="true" />
</property>
Entsprechend der Datentyp Serializable für die Variable "preis" in der Item Klasse. Ich habe schon versucht, die Tabellenspalte stattdessen auf einen String oder ein java.lang.Float zu mappen, aber die Fehlermeldung bleibt dieselbe. Für Hinweise oder Lösungsvorschläge zu diesem Problem wäre ich dankbar.
EDIT: Das Problem hat sich erledigt, das Mapping auf "serializable" scheint ein Bug in bestimmten Hibernate versionen zu sein. Ich kann das property stattdessen auf Float mappen, allerdings war es falsch auf java.lang.Float zu mappen. Der richtige Eintrag für die Property lautet:
type="float"
und in der Java Klasse musste anschließend "Serializable" durch Float ersetzt werden, dann funktioniert es.
Zuletzt bearbeitet: