ClassCastException when binding a MaterializedNClobType value as NClob

Description

org.hibernate.type.MaterializedNClobType has:

  • org.hibernate.type.descriptor.java.StringTypeDescriptor#INSTANCE as its JavaTypeDescriptor

  • org.hibernate.type.descriptor.sql.NClobTypeDescriptor#DEFAULT as its SqlTypeDescriptor

When org.hibernate.type.descriptor.sql.NClobTypeDescriptor binds a String as an NClob, it calls StringTypeDescriptor#unwrap to "unwrap" the NClob.

StringTypeDescriptor#unwrap checks if Clob is assignable from the expected type (NClob). Since NClob extends Clob, a Clob is created and returned. This ultimately causes a ClassCastException when binding the returned value as an NClob.

The fix simply moves the check for an NClob before the check for a Clob, so that an NClob will be returned instead.

Environment

None

Status

Assignee

Gail Badner

Reporter

Gail Badner

Fix versions

Labels

None

backPortable

None

Suitable for new contributors

None

Requires Release Note

None

Pull Request

None

backportDecision

None

Components

Affects versions

5.2.10
5.1.7

Priority

Major