我在一個表中增加了一個新的CLOB列,並修改了我的hbm.xml - 文件來使用這個新列(舊列是VARCHAR2,因此太小):Java_Hibernate 3_CLOB_ORA-01461
(我用隨機出於演示的目的名)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="test.com.TestDO" table="TESTTABLE">
<id name="id" type="java.lang.Integer">
<column name="ID"/>
<generator class="sequence">
<param name="sequence">SEQ_SEQUENCENAME</param>
</generator>
</id>
</property>
<property name="columnName1" type="java.util.Date">
<column name="COLUMN_NAME1"/>
</property>
<property name="columnName2" type="java.lang.String">
<column name="COLUMN_NAME2"/>
</property>
<property name="columnName3" type="java.lang.String">
<column name="COLUMN_CLOB"/>
</property>
</class>
</hibernate-mapping>
正如你看到的,我的CLOB列(COLUMN_CLOB)被定義爲最後的,因爲首先我得到這個異常:
ORA-24816: Expanded non LONG bind data supplied after actual LONG or LOB column
我搜索了這個錯誤,並且解決方案是第p頁在insert-statement中最後綁定clob綁定,因此我將hbm.xml文件中的clob-column定義爲最後一個,如上所示。
現在我沒有得到ORA-24816的異常,但我得到這個異常:
ORA-01461: can bind a LONG value only for insert into a LONG column
產生的插入,聲明如下:
insert into TESTTABLE(COLUMN_NAME1, COLUMN_NAME2, COLUMN_CLOB, ID) values (?, ?, ?, ?)];
正如你可能已經注意到,COLUMN_CLOB - 列在所生成的插入語句中不會最後出現。我不知道hbm-xml -file中的順序是否會影響生成的insert-statement中列的順序?
但無論如何,我沒有得到ORA-24816了,只是ORA-01461。我不知道如何解決這個問題。
我使用Hibernate 3和Oracle版本:企業版發佈11.2.0.4.0 - 64位生產
編輯:
我有相同的問題,因爲這裏描述: http://newtechnobuzzz.blogspot.ch/2014/07/ora-24816-expanded-non-long-bind-data.html#.Wcy-QdFpHRY
我嘗試了以下解決方案:
- Chaning getter和setter方法的順序不起作用
- 改變你hml.xml -file申報財產的順序並 不行
鏈接,並在其他網站上所描述的問題,國家這錯誤時拋出 如果您嘗試插入數據時發生在varchar2和clob列中(長度爲4000的2個字符串)。然而,我只是將數據插入大於4000的clob-column。我不再使用舊的varchar2 - 列。
現在,我試圖通過使用此解決方案來解決此問題: 它可以通過編寫兩個更新查詢來解決。首先,通過Update查詢保存/更新實體,然後編寫另一個查詢以更新該實體中的LOB列。
但是,我不太明白,我該如何修改我的代碼。我的方法是這樣的:
@Override
@Transactional(readOnly=false, propagation=Propagation.MANDATORY)
public TestDO saveTest(TestDO test) {
getHibernateTemplate().saveOrUpdate(test);
return test;
}
但我保存的字符串。字符串大於4000,這就是爲什麼我想將它們保存在clob-column中。因此,我需要使用java.lang String作爲類型右鍵?我也有其他表具有clob列,並在hbm.xml文件中聲明爲java.lang.String,它的工作原理 – Norbert94
我的猜測是列類型和傳遞給列的數據類型之間存在不匹配,也許你應該使用java.sql.Clob而不是java.lang.String 如果它適用於其他表,那麼也許它是插入staement和列聲明之間的列順序的東西 –
但在java中我傳遞一個字符串,所以我不能使用java.sql.Clob但使用java.lang.String,因爲我在Java中的屬性是一個字符串。我正在嘗試添加sql-type =「CLOB」並對其進行測試 – Norbert94