[ https://issues.apache.org/jira/browse/OPENJPA-119?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Kevin Sutter resolved OPENJPA-119. ---------------------------------- Resolution: Fixed Resolved. > 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.