我在表中添加了一个新的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
我尝试了以下解决方案:
链接和其他网站上描述的问题,说明了这个问题 如果您尝试在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;
}
答案 0 :(得分:0)
从我所看到的,CLOB列的属性类型尚未正确声明,请尝试:
<property name="columnName3" length="100000" type="StringClob">
<column name="COLUMN_CLOB"/>
</property>