我在Hibernate中更新表时遇到异常
ORA-24816:在实际LONG或LOB列之后提供的扩展非LONG绑定数据
我也提取了sql查询,看起来像是
Update table_name set columnName (LOB)=value, colmun2 (String with 4000)=value where id=?;
实体类
class Test{
@Lob
private String errorText;
@Column(length = 4000)
private String text;
}
请帮助我,这是什么问题
由于 拉维库马尔
答案 0 :(得分:6)
运行oerr ora 24816
以获取有关错误的详细信息:
$ oerr ora 24816
24816, ... "Expanded non LONG bind data supplied after actual LONG or LOB column"
// *Cause: A Bind value of length potentially > 4000 bytes follows binding for
// LOB or LONG.
// *Action: Re-order the binds so that the LONG bind or LOB binds are all
// at the end of the bind list.
因此,仅使用1个查询的另一个解决方案是在所有非LOB / LONG绑定后移动您的LOB / LONG绑定。 Hibernate可能会或可能不会这样。也许更像是:
update T set column2 (String with 4000)=:1, columnName (LOB)=:3 where id=:2;
此DML限制似乎至少存在于Oracle 8i之后。
参考文献:
答案 1 :(得分:3)
我发现了问题。 1.当数据库和实体中的hibernate更新数据有4000个字符列和lob类型列然后hibernate抛出此异常
我已经通过编写两个更新队列解决了这个问题 1.首先我使用Update()保存实体 2.为lob列更新写了另一个更新查询
由于 拉维
答案 2 :(得分:2)
我在oracle db和foudn Hibernate Guys fixed here
中也遇到了同样的错误在我的情况下,我们已经在使用hiberante 4.3.7,但没有提到该字段是Lob in Entity
重现步骤
解决方案
在各个实体中注释您的clob / blob字段
import javax.persistence.Lob;
...
@Lob
@Column(name = "description")
private String description;
....
如果要查看差异,请在进行上述更改后通过在persistence.xml中为"true"
设置"hibernate.show_sql"
来启用sql语句的调试。
答案 3 :(得分:2)
我确实知道这个帖子已经很老了,但我想我会在这里分享我自己的相同错误信息以供将来参考。
我有几天完全相同的症状(即ORA-24816)。我遇到的各种线程有点侧面跟踪,表明这与参数绑定的顺序有关。就我而言,这不是问题。此外,我努力重现此错误,它只发生在部署到应用程序服务器后,我无法通过集成测试重现这一点。
但是,我看了一下我绑定参数的代码,发现:
preparedStatement.setString(index, someStringValue);
我将其替换为:
preparedStatement.setClob(index, new StringReader(someStringValue));
这对我有用。
答案 4 :(得分:1)
我在尝试将数据插入表格时遇到了这个问题。要避免此错误,只需在insert语句的末尾保留所有包含" LOB" 数据类型的字段。
例如
Table1有8个字段(Field1,Field2,...... Field8等),
其中
Field1和Field2属于CLOB数据类型
,其余为Varchar2数据类型
。然后在插入数据时,请确保将 Field1和Field2 值保留在最后,如下所示。
INSERT INTO TABLE1 ( Field3,Field4,Field5,Field6,Field7,Field8,Field1,Field2)
Values ('a','b','c','d','e','f','htgybyvvbshbhabjh','cbsdbvsb')
答案 5 :(得分:0)
将LOB绑定放在最后。看看是否能解决问题..