This post is relating to the error that often comes on ADF Applications.
Error : oracle.jbo.RowInconsistentException: JBO-25014: Another user has changed the row with primary key
Main Cause :
This comes up when user commits the data on ADF page, the framework checks whether if the row which is being modified and being committed by the current user is still in the same state as it was when the framework fetched the row from the database.
- Suppose a user A wants to modify the Salary of an Employee with Employee_id 10.
- He picks the row and started editing the record and sets the Salary to 3500.
- Meanwhile a new user B who also wanted to update the Salary of Employee_id 10 picks the record and edits the record and sets the Salary to 3000, and commits the record.
- Now if the user A commits the record then this error will appear.
- This will appear as when the user A started editing the record, at that time framework made a copy of same record and kept with it.
- When the user A completed its entry and try to commit the record, then the framework compares the record saved with it and the same record currently in the database.
- This is to ensure that while the user A was editing the data then the same record was not modified by any other user. This done to maintain the consistency of the database.
- As if the A is allowed to commit the data then the changes made by B will be lost.
- This is the scenario in case of Optimistic Locking Mechanism. If you want to know more about Locking mechanism http://adfjavacodes.blogspot.in/2014/04/adf-alternate-of-current-row-selection.html
Normally this is case. But in ADF Applications this comes up even if the Another User is not modifying the record.
Here are some of the causes :
- Formatting in case of Date Columns.
- Problem : Suppose the Date saved as timestamp in database as '12-11-2015 11:10:55.001' and in the ADF Application it is '12-11-2015 11:10:55'. Ideally they are same but for the framework this is a mismatch.
- Solution : The trick to avoid this error is to send the data in the database after the formatting i.e. '12-11-2015 11:10:55' so that on comparison it compares '12-11-2015 11:10:55.000' and '12-11-2015 11:10:55'
- Formatting in case of Number Columns.
- PostChanges() being called in the application.
- Problem : Data is posted to the database in case of PostChanges(). And if after that the data is modified then again this comes as there is difference between database and framework. Suppose the value of a column is 'A' before postChanges and afterwards it is changed to 'B'. Then on commit this comes up, not always but often in case of PostChanges.
- Solution : This is no particular sure solution to this, but we have certain options
- Executing the VO before commit.
- We can use Refresh on Insert, Refresh on Modifiy attributes of Entity. Set it to true to avoid this error.
Now as we have done the homework :) regarding this, now It’s a task to identify that on which attribute this error is coming. Here are the steps.
- Start the server.
- Go To we logic server console | Actions-> Configure Oracle Diagnostic Logging
- Now go set the log to finest for oracle.jbo to finest
- Now go to preference in Jdeveloper and increase the log lines to 30000 as too many log rows will be generated.
- Now clear the log before the event on which this error occurs then perform the event.
- Then in the log search for text 'Entity Compare failed' and it will show you the attribute name for which this error is appearing and Value.