2017-09-27 47 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