1. 程式人生 > >Hibernate繼承對映的“Could not format discriminator value to SQL string”錯誤解決方法

Hibernate繼承對映的“Could not format discriminator value to SQL string”錯誤解決方法

藉助於Hibernate強大的O/R Mapping能力,我們能夠通過discriminator輕易地將一顆繼承樹對映到一個表中,通過discriminator確定具體對映的子類。

在設定@hibernate.discriminator column="type" type="integer"後,啟動Hibernate報錯:

Could not format discriminator value to SQL string

搜尋Hibernate官方文件後發現問題,原來Hibernate預設的discriminatortypeString,當設定discriminatortypeinteger

後,需要為父類也設定 class table="TABLE_NAME" discriminator-value="not null",否則,Hibernate預設的discriminator-value是完整的類名,在轉換Stringint時造成NumberFormatException

即:

 <class name="com.sjr.bean.PeopleT" table="J_PEOPLE2" schema="SXBBKF" discriminator-value="not null">  --這裡加上
        <id name="id" type="long">
            <column name="ID" precision="22" scale="0" />
            <generator class="native"></generator>
        </id>
        
         <discriminator column="type" type="int"/>   --必須直接跟在id後面
         
        <property name="name" type="string">
            <column name="NAME" length="20" />
        </property>
        <property name="age" type="int">
            <column name="AGE" precision="22" scale="0" />
        </property>
        
        <subclass name="com.sjr.bean.Student" discriminator-value='1'>   --實際是從字串轉化為整型的
        <property name="school"></property>
        </subclass>
        
        <subclass name="com.sjr.bean.Staff" discriminator-value='2'>
        <property name="company"></property>
        </subclass>


最後執行XDoclet,生成hbm檔案:

<?xml version="1.0" encoding="iso-8859-1"?>

<!DOCTYPE hibernate-mapping PUBLIC

    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <class name="com.crackj2ee.example.AbstractClass" table="TABLE_NAME" discriminator-value="not null"

>

        <id name="id" column="id" type="java.lang.Long" unsaved-value="null">

            <generator class="increment"/>

        </id>

        <discriminator column="type" not-null="true" type="integer"/>

        <subclass name="com.crackj2ee.example.SubClass1" discriminator-value="1">

        <subclass name="com.crackj2ee.example.SubClass2" discriminator-value="2">

    </class>

</hibernate-mapping>