Ortus Hibernate ORM Extension 6.5.4 Released

The Ortus Hibernate ORM Extension v6.5.4 has been released, with important fixes for Lucee 7.1 compatibility.

As a reminder, the original Lucee ORM extension is no longer actively maintained. Ortus have forked it and are actively maintaining it as the recommended ORM extension for Lucee. See the Lucee ORM docs for more details.

What changed

  • Removed the old org.lucee.xml.apis bundle from Require-Bundle in the extension manifest
  • Fixed duplicate entries in the manifest

These changes resolve an OSGi Uses constraint violation that prevents the ORM extension from loading on Lucee 7.1, where the Felix framework’s system package handling is being refactored (LDEV-6044).

Compatibility

Tested across the Lucee ORM test suite:

Lucee 6.2 Lucee 7.0 Lucee 7.1
Lucee ORM ext (5.4.29.27-BETA) Pass Pass Fail - OSGi constraint violation
Ortus ORM ext (6.5.4) Pass Pass Pass

The old Lucee ORM extension cannot load on Lucee 7.1 due to the org.lucee.xml.apis bundle conflicting with the Felix framework’s javax.xml.datatype package exposure. The Ortus extension, with that stale dependency removed, works across all current Lucee versions.

Links

Upgrading

Update to 6.5.4 to ensure compatibility with Lucee 7.1 when it ships. The extension ID for the Ortus ORM extension is D062D72F-F8A2-46F0-8CBC91325B2F067B.

3 Likes

Now that’s been merged, I have a filed a number of new ORM PRs

PR #20 - LDEV-3768 fix NPE on wrong-case HQL named parameters

When an HQL query uses a wrong-case column name to declare a parameter (e.g. ant instead of Ant), getNamedParameterExpectedType() returns null, causing an NPE in HibernateCaster.toSQL(). Fix adds a null check to throw a helpful “entity names are case sensitive” error instead.

PR #21 - LDEV-3525 throw helpful error for missing .hbm.xml mapping file

When autogenmap=false and the .hbm.xml mapping file doesn’t exist, the extension throws a raw FileNotFoundException instead of a helpful error. Fix adds a !resource.exists() check to throw “Hibernate mapping not found for entity” with the missing file path.

PR #22 - LDEV-4561 fire CFC entity events before global events

ORM events fire in the wrong order — global event handler fires before entity-level CFC handler. Per Adobe docs, CFC events should fire first. Fix swaps the order in all event methods (preInsert, postInsert, preDelete, postDelete, preUpdate, postUpdate, postLoad).

PR #23 – Connection Leak: Dead Reconnect Code (LDEV-6156)

Tech debt from the Hibernate 3 era — SessionAndConn borrows an extra JDBC connection in its constructor that sits idle for the entire session lifetime. The Session.reconnect() recovery path it was intended for has thrown IllegalStateException unconditionally since Hibernate 5.6.

Under edge conditions (MySQL Connector/J 9.5 under pool pressure, stale connections), isConnected() can return false, triggering the dead reconnect block — which leaks the connection.

Additionally, SessionAndConn.close() had no try-finally (so if s.close() throws, the connection is never released), and closeAll() aborted on first exception, leaving remaining sessions unclosed.

Fix:

  • Remove dead dc field, connect(), getConnection(), and reconnect block
  • Replace with session recovery (close broken session, open fresh one)
  • Make close() and closeAll() robust against exceptions

Related to LDEV-6129 (original connection leak report) and the core fixes in LDEV-6138 / LDEV-6139.

PR #24 - LDEV-6159 New ormSettings for ORM logging

Configure ORM logging directly from Application.cfc — no Java logging knowledge required:

this.ormSettings = {
    logSQL    : true,    // SQL statements (DDL + DML)
    logParams : true,    // bound parameter values (no more ?)
    logCache  : true,    // second-level cache activity
    logLevel  : "error"  // overall verbosity (trace/debug/info/warn/error)
};

All output routes through Lucee’s orm.log. Works with Lucee Admin, .CFConfig.json, and LUCEE_LOGGING_FORCE_APPENDER=console for Docker/K8s.

Requires: Set the Lucee orm log level to DEBUG (or TRACE for logParams) in Lucee Admin or .CFConfig.json.

Removes the Logback dependency — no more CVE patching treadmill.

2 Likes

For LDEV-6159, when you say “Set the Lucee orm log level to DEBUG…” what do you mean? If I have the console log level set to WARN, and I set this setting to WARN, is it expected I see those logSQL commands (among others?)