Намерих уловката и тя не е свързана с кода.
Правилният nullSafeGet в Hibernate UserType, както е отбелязано в посочения отговор, е:
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);
}
}
ПРОБЛЕМ: когато използвате SECUREFILE BINARY XML колона (не CLOB), трябва да използвате най-новото (11.2.0.2+) разпространение на xdb*.jar, което в този случай е xdb6.jar (~257kb). По-ранният xdb*.jar (~136kb за 10.x) ще продължи да функционира, без да създава изключения дори при неправилно декодиране на BINARY XML.
TL;DR :Изтеглете xdb6.jar (~257kb) от Oracle 11gR2 (11.2.0.3) JDBC страница с драйвери . По-старите xdb буркани се повреждат тихо и ще ви натъжат.