문제

I'm quite new to Hibernate since I've always used plain JDBC. I'm trying to configure the entities by using NetBeans' reverse engineering process against a SQL Server database. I've followed the NetBeans' webpage tutorial and I'm able to get a new package into my project with all entities created, but when I run this simple query from Country in the HQL editor I get this error:

org.hibernate.type.SerializationException: could not deserialize
    at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:217)
    at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:240)
    at org.hibernate.type.SerializableType.fromBytes(SerializableType.java:82)
    at org.hibernate.type.SerializableType.get(SerializableType.java:39)
    at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163)
    at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:154)
    at org.hibernate.type.AbstractType.hydrate(AbstractType.java:81)
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2096)
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1380)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1308)
    at org.hibernate.loader.Loader.getRow(Loader.java:1206)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:580)
    at org.hibernate.loader.Loader.doQuery(Loader.java:701)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
    at org.hibernate.loader.Loader.doList(Loader.java:2220)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
    at org.hibernate.loader.Loader.list(Loader.java:2099)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
Caused by: java.io.StreamCorruptedException: invalid stream header: 32003300
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:782)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279)
    at org.hibernate.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.java:252)
    at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:209)
    ... 23 more

The Country.hbm.xml file contains the following:

<?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 08-may-2014 0:02:21 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
    <class name="Entity.Country" table="Country" schema="dbo" catalog="TestOTDB">
        <id name="countryId" type="string">
            <column name="Country_ID" length="36" />
            <generator class="assigned" />
        </id>
        <property name="countryName" type="serializable">
            <column name="Country_Name" not-null="true" />
        </property>
        <property name="countryDescription" type="serializable">
            <column name="Country_Description" />
        </property>
        <property name="countryCode" type="serializable">
            <column name="Country_Code" not-null="true" />
        </property>
        <set name="sites" inverse="true">
            <key>
                <column name="Site_CountryID" length="36" />
            </key>
            <one-to-many class="Entity.Site" />
        </set>
    </class>
</hibernate-mapping>

The thing is that all those types where "serializable" appear are supposed to be varchar in my SQL Server database. Does anybody have any idea?

Thanks!

도움이 되었습니까?

해결책

I finally found the way to solve this problem. It looks like the hibernate data types should be forced in some cases (I'm not sure and what does it depend on...), and in my case all string and/or text columns coming from SQL Server should be forced to java.lang.String, by adding type-mapping to the hibernate.reveng.xml file:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd">
<hibernate-reverse-engineering>
    <schema-selection match-catalog="DB_Name" match-schema="dbo"/>
    <type-mapping>
        <sql-type jdbc-type="VARCHAR" hibernate-type="java.lang.String" />
        <sql-type jdbc-type="NVARCHAR" hibernate-type="java.lang.String" />
        <sql-type jdbc-type="NCHAR" hibernate-type="java.lang.String" />
    </type-mapping>
    <table-filter match-name="Table1"/>
    <table-filter match-name="Table2"/>
    <table-filter match-name="TableN"/>
</hibernate-reverse-engineering>

Hope this helps to anybody else.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top