You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by rpalache <ra...@oracle.com> on 2009/07/05 06:39:50 UTC

Re: Data consistency issues while modifying collections.

Can some one please help me with this.

The main question is if we can always turn on collection tracking.

Thanks in advance,
Ravi.


rpalache wrote:
> 
> 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.-tp3176563p3207723.html
Sent from the OpenJPA Developers mailing list archive at Nabble.com.