項(xiàng)目中用到 長(zhǎng)文本作為內(nèi)容
pojo中使用 string 類(lèi)型
數(shù)據(jù)庫(kù) oracle9i 用的的clob字段
pojo:
private String content;
public void setContent(String content){
this.content = content;
}
hibernate配置
<property name="content" column="C_Content" type="text" length="10000"></property>
發(fā)現(xiàn)當(dāng)content 字段的內(nèi)容在 1000~2000 字符長(zhǎng)度中間的時(shí)候出現(xiàn)
sql錯(cuò)誤
而文本長(zhǎng)度小于1000 長(zhǎng)于2000 都沒(méi)有
問(wèn)題。
問(wèn)題:hibernate配置中l(wèi)ength="10000"屬性是做什么用的?我嘗試過(guò) 將他配置成1000,5000,1w或者不配置 最后執(zhí)行的結(jié)果都一樣
查
資料 google baidu。。。
一般認(rèn)為 length指定的是text的最大長(zhǎng)度,這里顯然不是
又有認(rèn)為 是將java中string 值當(dāng)作clob處理的最小長(zhǎng)度,也就是當(dāng)string長(zhǎng)度小于這個(gè)值的時(shí)候
當(dāng)string處理,當(dāng)string大于這個(gè)長(zhǎng)度的時(shí)候當(dāng)text(clob)處理。但是我將length設(shè)置為1000時(shí),輸入1k+文本
依然有sql錯(cuò)誤。超過(guò)2000卻沒(méi)有問(wèn)題。
so..這兩個(gè)都不是答案.
又有人說(shuō),介個(gè)是
jdbc的
bug 換成10g的就米有問(wèn)題了。遂嘗試..未果,問(wèn)題依舊。
finally..這個(gè)length屬性到底干嘛用 沒(méi)搞清楚.. 抑或 不該這么配置?
繼續(xù)尋找,找到另外一種解決辦法。可以通過(guò)spring來(lái)解決這個(gè)問(wèn)題
hibernate配置
<property name="content" column="C_Content" type="org.springframework.orm.hibernate3.support.ClobStringType"
length="10000"></property>
spring配置
<bean id="oracleLobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler">
<property name="nativeJdbcExtractor">
<ref local="nativeJdbcExtractor"/>
</property>
</bean>
<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor">
</bean>
上面2個(gè)bean是關(guān)鍵
然后在sessionFactory的bean中加入
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="lobHandler">
<ref bean="oracleLobHandler" />
</property>
。。。其他
</bean>
問(wèn)題解決,但是length="10000" 屬性依然無(wú)用,可正常插入 任意長(zhǎng)度的字符串
但是這樣的話(huà) 數(shù)據(jù)庫(kù)就不能跨平臺(tái)了..so 期待跨數(shù)據(jù)庫(kù)平臺(tái)的 方案~~