Hibernate和CLOB的奇怪的Oracle错误

时间:2011-07-05 17:39:14

标签: hibernate oracle10g

我遇到了以下问题,该问题似乎是pretty common。例外是Cannot update entity: [...] nested exception is java.sql.BatchUpdateException: ORA-24816: Expanded non LONG bind data supplied after actual LONG or LOB column。看起来Oracle不喜欢在LOB或CLOB之后将大值(> 4000个字符)绑定到参数。有人解决了这个问题吗?

2 个答案:

答案 0 :(得分:9)

这是:ORA-24816
**这是一个限制,LONG绑定变量必须在语句中排在最后。 **

来源:http://www.odi.ch/weblog/posting.php?posting=496

解决方案:通过重命名hibernate模型中的字段,以便按字母顺序排序时,clob列的名称晚于varchar2列(我在java类中使用'z'<前缀为clob字段/ strong>),一切正常,因为clob参数位于查询hibernate构建中的varchar参数之后。

答案 1 :(得分:2)

我们遇到了与Hibernate 3.2.1相同的问题,并通过先插入没有CLOB的记录然后用CLOB更新该记录来修复。

public class Employee{

    @Lob
    @Column
    private String description;

    //getters setters
}

String desc = emp.getDescription();
emp.setDescription(null);
session.save(entity);
session.flush();
session.evict(entity);

StringBuilder sb = new StringBuilder();
sb.append("update Employee set description:description");
Query updateQuery = session.createQuery(sb.toString());
updateQuery.setParameter("description", desc, Hibernate.STRING);
updateQuery.executeUpdate();

如果您正在使用Hibernate注释,则无法预测insert语句中列的顺序。这已在Hibernate v4.1.8中修复。

https://hibernate.atlassian.net/browse/HHH-4635