Joiner Mover Leaver Change Requests are getting rejected with "object references an unsaved transient instance" error in RSA Governance & Lifecycle
5 months ago
Originally Published: 2025-05-19
Article Number
000073387
Applies To
  • RSA Governance & Lifecycle 8.0 P04
Issue

Any Change Request triggered by the Joiner Leave Mover Rule is getting rejected. The associated Workflow is also getting canceled. The the below error indicates that the object being saved contains a reference to another object that Hibernate is treating as a new (unsaved) instance. In the aveksaServer.log:

04/04/2025 05:09:14.294 ERROR (CR-Creation-8) [org.hibernate.internal.SessionImpl] HHH000346: Error during managed flush [object references an unsaved transient instance - save the transient instance before flushing: com.aveksa.server.core.cr.ChangeRequestItemDependency]
04/04/2025 05:09:14.296 ERROR (CR-Creation-8) [com.aveksa.server.core.concurrent.ConcurrentUtils] Task encountered an error.
com.aveksa.server.core.AdminServiceException: com.aveksa.server.db.PersistenceException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.aveksa.server.core.cr.ChangeRequestItemDependency
	at com.aveksa.server.core.cr.ChangeRequestCreationHandler.createChangeRequest(ChangeRequestCreationHandler.java:340) ~[server.jar:?]
	at com.aveksa.server.core.cr.ChangeRequestCreationHandler.createChangeRequests(ChangeRequestCreationHandler.java:222) ~[server.jar:?]
	at com.aveksa.server.core.cr.ChangeRequestCreationHandler.createChangeRequests(ChangeRequestCreationHandler.java:109) ~[server.jar:?]
	at com.aveksa.server.core.cr.concurrent.CRCreationTask.call(CRCreationTask.java:39) ~[server.jar:?]
	at com.aveksa.server.core.cr.concurrent.CRCreationTask.call(CRCreationTask.java:19) ~[server.jar:?]
	at java.util.concurrent.FutureTask.run(FutureTask.java:277) ~[?:1.8.0]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1160) ~[?:1.8.0]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:1.8.0]
	at java.lang.Thread.run(Thread.java:825) ~[?:2.9 (08-17-2023)]
Caused by: com.aveksa.server.db.PersistenceException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.aveksa.server.core.cr.ChangeRequestItemDependency
	at com.aveksa.server.db.persistence.PersistenceServiceProvider.commitTransaction(PersistenceServiceProvider.java:2478) ~[server.jar:?]
	at com.aveksa.server.db.persistence.PersistenceServiceProvider.commitTransaction(PersistenceServiceProvider.java:2436) ~[server.jar:?]
	at com.aveksa.server.db.PersistenceManager.commitTransaction(PersistenceManager.java:359) ~[server.jar:?]
	at com.aveksa.server.core.cr.ChangeRequestCreationHandler.persistChangeRequestWithCommits(ChangeRequestCreationHandler.java:551) ~[server.jar:?]
	at com.aveksa.server.core.cr.ChangeRequestCreationHandler.persistChangeRequest(ChangeRequestCreationHandler.java:381) ~[server.jar:?]
	at com.aveksa.server.core.cr.ChangeRequestCreationHandler.createChangeRequest(ChangeRequestCreationHandler.java:290) ~[server.jar:?]
	... 8 more
Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.aveksa.server.core.cr.ChangeRequestItemDependency
	at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:279) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.type.EntityType.getIdentifier(EntityType.java:462) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:144) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:894) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1313) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.persister.collection.OneToManyPersister.recreate(OneToManyPersister.java:186) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:50) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:582) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:456) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1282) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:465) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:2963) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2339) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:147) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65) ~[hibernate-core-5.0.11.Final.jar:5.0.11.Final]
	at com.aveksa.server.db.persistence.PersistenceServiceProvider.commitTransaction(PersistenceServiceProvider.java:2467) ~[server.jar:?]
	at com.aveksa.server.db.persistence.PersistenceServiceProvider.commitTransaction(PersistenceServiceProvider.java:2436) ~[server.jar:?]
	at com.aveksa.server.db.PersistenceManager.commitTransaction(PersistenceManager.java:359) ~[server.jar:?]
	at com.aveksa.server.core.cr.ChangeRequestCreationHandler.persistChangeRequestWithCommits(ChangeRequestCreationHandler.java:551) ~[server.jar:?]
	at com.aveksa.server.core.cr.ChangeRequestCreationHandler.persistChangeRequest(ChangeRequestCreationHandler.java:381) ~[server.jar:?]
	at com.aveksa.server.core.cr.ChangeRequestCreationHandler.createChangeRequest(ChangeRequestCreationHandler.java:290) ~[server.jar:?]
	... 8 more 
Cause

The Joiner Mover Leaver Rule is adding the entitlement to a terminated user. The Change Request items are in turn getting rejected in the initial fulfillment phase. As there is no need to proceed with fulfillment, the associated fulfillment workflows are transitioned to the Cancelled state instead of getting stuck at the starting node. 

Resolution

A feature has been introduced in RSA Governance & Lifecycle under the custom flag "EnableAddEntitlementToTerminatedUsers" to Reject the Change Request items for terminated users by default.

Workaround

Enable the "EnableAddEntitlementToTerminatedUsers" custom flag from the UI. This will revert the application to the correct behavior and the Change Requests will be completed successfully moving forward.