openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Robert Krier (JIRA)" <j...@apache.org>
Subject [jira] Updated: (OPENJPA-1899) Evict from L2 of a object causes secondary objects to never be loaded in graph
Date Mon, 29 Nov 2010 17:37:10 GMT

     [ https://issues.apache.org/jira/browse/OPENJPA-1899?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Robert Krier updated OPENJPA-1899:
----------------------------------

    Description: 
I have a simple example.  A customer has a reference to an address and a (primary) contact
(an extension of person).  Find the customer, get the contact and evict it from L2.  Now find
the customer again using a new entity manager.  Begin a Tx and change the address of the contact
and then call Customer.getPrimaryContact() (this is important)   Rollback the Tx.  Now find
the customer again using another new EntityManager and call Customer.getPrimaryContact().getAddress().
 The address associated with the contact is Null and not the original address as expected.
 The same scenario works fine under OpenJPA 1.2.2.  

The reason this is a big problem for us is we use L2 caching in our application and the application
is clustered.  The same problem occurs if different nodes in the cluster operate on the same
objects.  In a cluster "evict" is not directly called, but the RemoteCommitProvider will evict
the L2 and create the same problem.  

I have attached example code to reproduce the problem using a single JVM and calling Evict.
 I also have another example where you can deploy the code on two nodes in a cluster and see
the problem occurs that way as well.  Each example contains Unix shell scripts and Windows
cmd files as well.  Each are paired for JPA 1.0 and JPA 2.0.  Again, the problem only occurs
under JPA 2.0.

This is a block for us.  We cannot ship our product with this type of problem as it means
objects and their graph can be corrupted.  


  was:
I have a simple example.  A customer has a reference to an address and a (primary) contact
(an extension of person).  Find the customer, get the contact and evict it from L2.  Now find
the customer again using a new entity manager.  Begin a Tx and change the address of the contact
and then call Customer.getPrimaryContact() (this is important)   Rollback the Tx.  Now find
the customer again using another new EntityManager and call Customer.getPrimaryContact().getAddress().
 The address associated with the contact is Null and not the original address as expected.
 The same scenario works fine under OpenJPA 1.2.2.  

The reason this is a big problem for us is we use L2 caching in our application and the application
is clustered.  The same problem occurs if different nodes in the cluster operate on the same
objects.  In a cluster "evict" is not directly called, but the RemoteCommitProvider will evict
the L2 and create the same problem.  

I have attached example code to reproduce the problem using a single JVM and calling Evict.
 I also have another example where you can deploy the code on two nodes in a cluster and see
the problem occurs that way as well.  Each example contains Unix shell scripts and Windows
cmd files as well.  Each are paired for JPA 1.0 and JPA 2.0.  Again, the problem only occurs
under JPA 2.0.

This is a block for us.  We cannot ship our product with this type of problem as it means
objects and their graph can be corrupted.  


One more thing to note:
1) The problem does not occur if L2 caching is not enabled. This is not a viable workaround
for us.
2) The problem does not occur if eager fetching is used in the object graph instead of lazy.
 This is not a viable workaround for us.

Bob

> Evict from L2 of a object causes secondary objects to never be loaded in graph
> ------------------------------------------------------------------------------
>
>                 Key: OPENJPA-1899
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-1899
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 2.0.0, 2.0.1
>         Environment: N/A
>            Reporter: Robert Krier
>            Priority: Blocker
>         Attachments: evictproblem.zip
>
>
> I have a simple example.  A customer has a reference to an address and a (primary) contact
(an extension of person).  Find the customer, get the contact and evict it from L2.  Now find
the customer again using a new entity manager.  Begin a Tx and change the address of the contact
and then call Customer.getPrimaryContact() (this is important)   Rollback the Tx.  Now find
the customer again using another new EntityManager and call Customer.getPrimaryContact().getAddress().
 The address associated with the contact is Null and not the original address as expected.
 The same scenario works fine under OpenJPA 1.2.2.  
> The reason this is a big problem for us is we use L2 caching in our application and the
application is clustered.  The same problem occurs if different nodes in the cluster operate
on the same objects.  In a cluster "evict" is not directly called, but the RemoteCommitProvider
will evict the L2 and create the same problem.  
> I have attached example code to reproduce the problem using a single JVM and calling
Evict.  I also have another example where you can deploy the code on two nodes in a cluster
and see the problem occurs that way as well.  Each example contains Unix shell scripts and
Windows cmd files as well.  Each are paired for JPA 1.0 and JPA 2.0.  Again, the problem only
occurs under JPA 2.0.
> This is a block for us.  We cannot ship our product with this type of problem as it means
objects and their graph can be corrupted.  

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message