I am writing a piece of software that tracks medication usage. I am using JPA to interact with the database. My model consists of two entities: a Prescription
a
It Seems right.
However, I'll suggest to test it first... the more simple way to do this, is through debugging ... using your preferred IDE, set a debug point after the sentence:
entityMgr.lock(p, LockModeType.OPTIMISTIC_FORCE_INCREMENT);
Later, try to invoke your addDose(prescriptionId)
from two different clients, supplying the same prescriptionID ... and let one client finish first and see what happen with the another one.
This answer helped me understand the OPTIMISTIC_WRITE_LOCK
better and convinced me that my implementation is correct.
A more elaborate explanation follows (quotation added as it appears in a report authored by myself):
While EJB transactions may help prevent concurrent changes to the persisted state of an entity, they are insufficient in this case. This is because they are unable to detect the change to the
Prescription
entity as its corresponding database row is not changed when a newDose
is added to it. This stems from the fact that theDose
is the owning side of the relationship between itself and itsPrescription
. In the database, the row that represents theDose
will have a foreign key pointing to thePrescription
, but the row that represents thePrescription
will have no pointers to any of itsDose
s. The problem is remedied by guarding thePrescription
with an optimistic write lock that forces an update to thePrescription
’s row (to be specific: its version field) when a newDose
is inserted.