hibernate/hibernate-orm · error · JDBCException

Unable to set NCLOB string after creation

Error message

Unable to set NCLOB string after creation

What it means

StandardLobCreator.createNClob(String) obtains an empty NClob through Connection.createNClob() (via LobCreationContext) and then fills it with nclob.setString(1, string). Any SQLException from that flow is wrapped as JDBCException 'Unable to set NCLOB string after creation'.

Source

Thrown at hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/StandardLobCreator.java:51

	/**
	 * Create the basic contextual NCLOB reference.
	 *
	 * @return The created NCLOB reference.
	 */
	public NClob createNClob() {
		return lobCreationContext.fromContext( CREATE_NCLOB_CALLBACK );
	}

	@Override
	public NClob createNClob(String string) {
		try {
			final NClob nclob = createNClob();
			nclob.setString( 1, string );
			return nclob;
		}
		catch ( SQLException e ) {
			throw new JDBCException( "Unable to set NCLOB string after creation", e );
		}
	}

	@Override
	public NClob createNClob(Reader reader, long length) {
		// IMPL NOTE : it is inefficient to use JDBC LOB locator creation to create a LOB
		// backed by a given stream.  So just wrap the stream (which is what the NonContextualLobCreator does).
		return NonContextualLobCreator.INSTANCE.createNClob( reader, length );
	}
}

View on GitHub (pinned to fad1729dce)

Solutions

  1. Prefer mapping the field as @Nationalized String and let Hibernate choose NonContextualLobCreator (stream wrapping) instead of creating NClobs by hand
  2. Test Connection.createNClob() + setString() directly on your driver to confirm support and capture the real SQLException
  3. Upgrade the JDBC driver / database if the NClob write path is buggy
  4. Ensure the Session/connection stays open until flush completes

Example fix

// before: manual NClob creation
entity.setNote(session.getLobHelper().createNClob(bigText));

// after: let Hibernate manage nationalized text
@Nationalized String note; // on the entity
Defensive patterns

Strategy: try-catch

Validate before calling

// prove driver NClob support once at startup
try (Connection c = dataSource.getConnection()) {
    NClob n = c.createNClob();
    n.setString(1, "ping");
    n.free();
}

Try / catch

try {
    entity.setNote(lobHelper.createNClob(text));
}
catch (JDBCException e) {
    // fall back to plain String / @Nationalized mapping
    entity.setNote(text);
}

Prevention

When it happens

Trigger: Calling Hibernate.getLobHelper().createNClob(String), or persisting a nationalized String that the dialect maps to connection-created NClob, on a driver/DB where createNClob() or NClob.setString() fails: connection already closed, NCLOB support absent, or driver bugs.

Common situations: Drivers with partial national-character support; pooled connections that get validated/closed between LOB creation and setString; databases whose national charset is not configured.

Related errors


AI-assisted analysis of hibernate/hibernate-orm@fad1729dce (2026-08-22). Data as JSON: /api/errors/d2ffee767b33a3e4. Report an issue: GitHub.