Den Haken gefunden, und er hat nichts mit dem Code zu tun.
Das richtige nullSafeGet im Hibernate UserType, wie in der referenzierten Antwort angegeben, lautet:
public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException {
if (logger.isTraceEnabled()) {
logger.trace(" nullSafeSet: " + value + ", ps: " + st + ", index: " + index);
}
try {
XMLType xmlType = null;
if (value != null) {
xmlType = XMLType.createXML(getOracleConnection(st.getConnection()), (String)value);
}
st.setObject(index, xmlType);
} catch (Exception e) {
throw new SQLException("Could not convert String to XML for storage: " + (String)value);
}
}
PROBLEM: Wenn Sie eine SECUREFILE BINARY XML-Spalte (nicht CLOB) verwenden, müssen Sie die neueste (11.2.0.2+) Distribution von xdb*.jar verwenden, die in diesem Fall xdb6.jar (~257 KB) ist. Das frühere xdb*.jar (~136kb für 10.x) wird immer noch funktionieren, ohne irgendwelche Ausnahmen zu werfen, selbst wenn BINARY XML falsch dekodiert wird.
TL;DR :Laden Sie xdb6.jar (~257kb) von der herunter Oracle 11gR2 (11.2.0.3) JDBC-Treiberseite . Ältere xdb-Jars fallen stillschweigend aus und werden Sie traurig machen.