2017-09-27 52 views
0

我在一個表中增加了一個新的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; 
} 

回答

0

從我所看到的,屬性類型還沒有被宣佈爲正確的CLOB列,請嘗試:

<property name="columnName3" length="100000" type="StringClob"> 
    <column name="COLUMN_CLOB"/> 
</property> 
+0

但我保存的字符串。字符串大於4000,這就是爲什麼我想將它們保存在clob-column中。因此,我需要使用java.lang String作爲類型右鍵?我也有其他表具有clob列,並在hbm.xml文件中聲明爲java.lang.String,它的工作原理 – Norbert94

+0

我的猜測是列類型和傳遞給列的數據類型之間存在不匹配,也許你應該使用java.sql.Clob而不是java.lang.String 如果它適用於其他表,那麼也許它是插入staement和列聲明之間的列順序的東西 –

+0

但在java中我傳遞一個字符串,所以我不能使用java.sql.Clob但使用java.lang.String,因爲我在Java中的屬性是一個字符串。我正在嘗試添加sql-type =「CLOB」並對其進行測試 – Norbert94