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
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.
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.
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. ' ' –