2011-07-05 30 views
5

Znalazłem następujący problem, który wydaje się być jednym z następujących: prettycommon. Wyjątkiem jest Cannot update entity: [...] nested exception is java.sql.BatchUpdateException: ORA-24816: Expanded non LONG bind data supplied after actual LONG or LOB column. Wygląda na to, że Oracle nie lubi wiązania dużych wartości (> 4000 znaków) do parametrów po LOB lub CLOB. Czy ktoś rozwiązał ten problem?Dziwny błąd Oracle z Hibernate i CLOBs

Odpowiedz

9

To jest: ORA-24816
** Jest to ograniczenie, a zmienne wiążące LONG muszą być ostatnimi w instrukcji. **

źródło: http://www.odi.ch/weblog/posting.php?posting=496

Rozwiązanie: Zmiana nazwy pola w modelu hibernacji tak, że kolumna CLOB ma nazwę, która pochodzi później niż kolumny VARCHAR2 przy zamawianiu alfabetycznie (ja prefiksem pole Clob w klasa java z 'z'), wszystko działa poprawnie, ponieważ wtedy parametr clob pojawia się po parametrze varchar w kompilacji hibernacji zapytania.

+1

Okazało się, że z podmiotami XML odwzorowany mogę zmienić kolejność właściwości w konfiguracji, aby uzyskać CLOB do końca INSERT/UPDATE. Na przykład. '' –

2

Napotkaliśmy ten sam problem z Hibernate 3.2.1 i naprawiliśmy wstawiając rekord bez CLOB-ów, a następnie aktualizując ten rekord za pomocą 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(); 

Jeśli używasz adnotacji Hibernate, to nie ma sposobu, aby przewidzieć kolejność kolumn w instrukcji insert. Naprawiono to w Hibernate v4.1.8.

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

Powiązane problemy