Optimistic Locking Exceptions
If HDR receives an OptimisticLockException from the underlying JPA framework, it wraps the exception in oracle.hsgbu.hdr.base.persist.exception.CorePersistenceException with error code HDR_OBJECT_ALREADY_MODIFIED_ERROR. The client application should attempt to query again if necessary and resubmit updates to HDR.
Example 10-1 Optimistic Locking Exception
The following code sample illustrates an optimistic locking exception:
// create an Act
SET_II actId = dataTypeFactory.newSET_II("9.989898.5.6.100", "OBS1001", true);
Act act = actFactory.newObservation(ActMood.EVN, null, actId);
ControlAct controlAct = actFactory.newControlActEvent(
dataTypeFactory.nullCD(NullFlavor.NI), dataTypeFactory.nullSET_II(NullFlavor.NI));
controlAct.addOBActRelationship(ActRelationshipType.SUBJ, act);
rimService().submit(controlAct);
// retrieve two copies of the Act
Act retrievedAct1 = retrieveAct(actId);
Act retrievedAct2 = retrieveAct(actId);
// update the Act
ControlAct controlAct2 = actFactory.newControlActEvent(
dataTypeFactory.nullCD(NullFlavor.NI), dataTypeFactory.nullSET_II(NullFlavor.NI));
controlAct2.addOBActRelationship(ActRelationshipType.SUBJ, (Act)retrievedAct1.createNewVersion());
rimService().submit(controlAct2);
// try updating the same Act with the other retrieved copy
ControlAct controlAct3 = actFactory.newControlActEvent(
dataTypeFactory.nullCD(NullFlavor.NI), dataTypeFactory.nullSET_II(NullFlavor.NI));
controlAct3.addOBActRelationship(ActRelationshipType.SUBJ, (Act)retrievedAct2.createNewVersion());
try
{
rimService.submit(controlAct3);
}
catch (CTBLockingException e)
{
// One or more objects in the submission
// are locked by another process.
//
// Requery if necessary, and resubmit
// updates to HDR.
//
// In this case, we know the object is
// the Observation which was queried and
// versioned, but this can be verified by
// inspecting the Exception
Act requeriedAct = retrieveAct(actId);
ControlAct newControlAct = actFactory.newControlActEvent(
dataTypeFactory.nullCD(NullFlavor.NI), dataTypeFactory.nullSET_II(NullFlavor.NI));
newControlAct.addOBActRelationship(ActRelationshipType.SUBJ, (Act)requeriedAct.createNewVersion());
rimService.submit(newControlAct);
}