There are data consistency issues when modifying more number of elements in a
collection Vs less number of elements.
Following is a detailed explanation about the issue with example:
- Entity A has a collection of Entities AItems with cascade ALL.
- Test case :
Clear all the data inside tables representing Entity A and AItems.
Create 3 entity managers em1,em2 and em3.
em1.begin()
create A on em1 with id "1"
add 10 elements of AItems (id's from 0-9) to the created A(id 1).
persist A.
em1.commit()
em1.begin()
merge A ( created in the previous step)
Remove 3 elements of AItems from the merged A.
Add 3 elements of AItems ( id's 10,11,12) to the merged A (id 1).
With out committing em1
em2.begin()
query database to fetch A and construct object result2 of entity A.
Add 3 elements of AItems ( id's 13,14,15) to fetched A ( result2)
em2.commit ()
em1.commit()
em3.begin()
query database to check the size of AItems that are related to A ( id
1)
em3.commit()
The result on em3's query for AItems related to A, returns 13 as expected.
13 ( Initial 10 - em1's 3 + em1's 3 + em2's 3).
When the same test case is repeated with removing and adding 10 elements
instead of 3 as before then I get wrong results.
Add initial 10 AItems (id's 0-9) for A.
commit()
em1 will remove 10 AItems from the collection of A.
em1 will add 10 AItems (id's 10-19) to collection of A.
em2 will add 10 AItems (id's 20-29) to collection of A.
Commit em2.
Commit em1.
Then instead of 20 elements ( Initial 10 - em1's 10 + em1's 10 + em2's
10), I see only 10 elements.
The 10 elements that I see are from em1's added AItems ( id's 10-19).
I think the cause of the issue is that, when more number of elements
(compared to initial element count of collection) in a collection are
modified then collection tracking is disabled and openJPA tries to do the
following:
-- Delete every thing from the collection
-- Insert data back to collection.
While Inserting the data back it does not consider adding the dirty records
( em2's 10 added elements ) because the collection tracking is disabled.
I think the resolution is to enable collection tracking by default.
D:\openJPAsrc\openjpa_trunk\trunk>svn diff
Index:
openjpa-kernel/src/main/java/org/apache/openjpa/util/AbstractChangeTracker.java
===================================================================
---
openjpa-kernel/src/main/java/org/apache/openjpa/util/AbstractChangeTracker.java
(revision 78
9191)
+++
openjpa-kernel/src/main/java/org/apache/openjpa/util/AbstractChangeTracker.java
(working cop
y)
@@ -50,7 +50,7 @@
*/
protected Collection change = null;
- private boolean _autoOff = true;
+ private boolean _autoOff = false;
private boolean _track = false;
private Boolean _identity = null;
private int _seq = -1;
With the above change my test case is running fine.
Please let me know if you want me to open a JIRA for this issue.
Regards,
Ravi.
--
View this message in context:
http://n2.nabble.com/Data-consistency-issues-while-modifying-collections.-tp3176563p3176563.html
Sent from the OpenJPA Developers mailing list archive at Nabble.com.