Java_Hibernate 3_CLOB_ORA-01461

时间:2017-09-27 15:21:05

标签: java oracle hibernate clob

我在表中添加了一个新的CLOB列并修改了我的hbm.xml文件以使用这个新列(旧列是varchar2,因此太小了):

(我使用随机名进行演示)

<?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(COLUMN_CLOB)被定义为last,因为首先我得到了这个例外:

ORA-24816: Expanded non LONG bind data supplied after actual LONG or LOB column

我搜索了这个错误,解决方案是将clob绑定放在insert-statement的最后一个,所以我将hbm.xml文件中的clob-column定义为last,如上所示。< / p>

现在我没有得到ORA-24816例外,但我得到了这个例外:

ORA-01461: can bind a LONG value only for insert into a LONG column

生成的Insert-Statement如下所示:

insert into TESTTABLE(COLUMN_NAME1, COLUMN_NAME2, COLUMN_CLOB, ID) values (?, ?, ?, ?)]; 

您可能已经注意到,COLUMN_CLOB - 列在生成的Insert-Statement中不会出现在最后。我不知道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

我尝试了以下解决方案:

  • 查看getter和setter方法的顺序不起作用
  • 更改hbm.xml -file中声明的属性的顺序 不工作

链接和其他网站上描述的问题,说明了这个问题 如果您尝试在varchar2和clob列中插入数据(2个长度为4000的字符串),则会出现这种情况。但是我只是将数据插入到大于4000的clob-column中。我不再使用旧的varchar2-column了。

现在,我试图通过使用此解决方案来解决这个问题: 它可以通过编写两个更新查询来解决。首先,通过Update查询保存/更新实体,然后编写另一个查询以更新该实体中的LOB列。

但是,我不太明白,我应该如何修改我的代码。我的方法如下:

@Override
@Transactional(readOnly=false, propagation=Propagation.MANDATORY)
public TestDO saveTest(TestDO test) {

    getHibernateTemplate().saveOrUpdate(test);

    return test;
}

1 个答案:

答案 0 :(得分:0)

从我所看到的,CLOB列的属性类型尚未正确声明,请尝试:

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