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預設的discriminator的type是String,當設定discriminator的type為integer
即:
<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>