[ 
https://issues.apache.org/jira/browse/OPENJPA-119?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12469868
 ] 

Kevin Sutter commented on OPENJPA-119:
--------------------------------------

Here's what I decided to do...  I introduced a new boolean on the 
detachAll(OpCallbacks, boolean) method, leaving the original 
detachAll(OpCallbacks) as is.  The original method now calls the new method 
with a value of "true" so that the original processing takes place.  I have 
changed the EM.clear path so that it now calls the new method with a value of 
"false" so that no flushing takes place.  This seemed to be the least amount of 
churn and still allow both types of flush/clear processing to take place.

I have decided not to introduce a new detachAll method on the 
OpenJPAEntityManager interface at this time.  I personally like to wait for a 
need for modifying public interfaces, even if it's just for other products 
extending OpenJPA.

I'll be dropping the changes shortly (after the testing checks out).  I have 
also added a testcase for this scenario.

Kevin

> EntityManager.clear() should not implicitly invoke the flush operation
> ----------------------------------------------------------------------
>
>                 Key: OPENJPA-119
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-119
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: jpa
>            Reporter: Kevin Sutter
>         Assigned To: Kevin Sutter
>
> From the dev mailing list... 
> ======================================= 
> We've noticed that when EntityManager.clear() is invoked, an implicit flush() 
> is performed. Although the spec is cloudy in this area, I don't think this 
> processing is correct. The javadoc is as follows for clear(): 
> /** 
> * Clear the persistence context, causing all managed 
> * entities to become detached. Changes made to entities that 
> * have not been flushed to the database will not be 
> * persisted. 
> */ 
> public void clear(); 
> This indicates that Entities that have not been flushed will not be 
> persisted. Thus, I would say this implies that we should not be doing an 
> implicit flush. If the application wanted their Entities to be flushed before 
> the clear, then they can call the flush() method before calling clear(). We 
> shouldn't be doing this for them because then they have no choice. 
> The Pro EJB3 Java Persistence API book has similar wording on pages 138-139: 
> "..In many respects [clear] is semantically equivalent to a transaction 
> rollback. All entity instances managed by the persistence context become 
> detached with their state left exactly as it was when the clear() operation 
> was invoked..." 
> Our current processing for clear() eventually gets to this code: 
> public void detachAll(OpCallbacks call) { 
> beginOperation(true); 
> try { 
> if ((_flags & FLAG_FLUSH_REQUIRED) != 0) 
> flush(); 
> detachAllInternal(call); 
> } catch (OpenJPAException ke) { 
> throw ke; 
> } catch (RuntimeException re) { 
> throw new GeneralException(re); 
> } finally { 
> endOperation(); 
> } 
> } 
> Basically, if we have dirtied the Persistence Context, then do a flush() 
> followed by the detachAllInternal(). I don't think the clear() should be 
> doing this flush() operation. Any disagreement? 
> ======================================= 
> There was no disagreement, thus this JIRA issue.

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

Reply via email to