2011-07-05 47 views
5

Tôi đã gặp sự cố sau, có vẻ như là một số prettycommon. Ngoại lệ là Cannot update entity: [...] nested exception is java.sql.BatchUpdateException: ORA-24816: Expanded non LONG bind data supplied after actual LONG or LOB column. Có vẻ như Oracle không thích ràng buộc các giá trị lớn (> 4000 ký tự) vào các tham số sau một LOB hoặc CLOB. Có ai đã giải quyết vấn đề này không?Lỗi Oracle lạ với Hibernate và CLOBs

Trả lời

9

Đây là: ORA-24816
** Đó là giới hạn và các biến kết buộc LONG phải đến cuối cùng trong tuyên bố. **

nguồn: http://www.odi.ch/weblog/posting.php?posting=496

Giải pháp: Bằng cách đổi tên các trường trong mô hình hibernate để cột clob có một cái tên mà đến muộn hơn cột varchar2 khi đặt hàng theo thứ tự abc (tôi tiền tố lĩnh vực clob trong java class với 'z'), mọi thứ hoạt động tốt vì sau đó tham số clob xuất hiện sau tham số varchar trong truy vấn hibernate builds.

+1

tôi thấy rằng với các thực thể XML-ánh xạ tôi có thể thay đổi thứ tự của các thuộc tính trong cấu hình để có được những CLOBs đến cuối của câu lệnh INSERT/UPDATE. Ví dụ. '' –

2

Chúng tôi gặp vấn đề tương tự với Hibernate 3.2.1 và được sửa bằng cách chèn bản ghi mà không có CLOB trước và sau đó cập nhật bản ghi đó bằng 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(); 

Nếu bạn đang sử dụng chú thích Hibernate thì không có cách nào để dự đoán thứ tự các cột trong câu lệnh chèn. Điều này đã được sửa trong Hibernate v4.1.8.

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