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