openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "B.J. Reed (JIRA)" <j...@apache.org>
Subject [jira] Commented: (OPENJPA-1018) @PreUpdate raised for new entities annotated with @EntityListeners
Date Mon, 27 Apr 2009 19:59:30 GMT

    [ https://issues.apache.org/jira/browse/OPENJPA-1018?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12703325#action_12703325
] 

B.J. Reed commented on OPENJPA-1018:
------------------------------------

I made the suggested code change, but that has broken (at least) 2 of our JUnit test cases.

Failed tests:
testPreUpdateExceptionDuringFlushWithNewFlushedInstance(org.apache.openjpa.persistence.callbacks.TestExceptionsFromCallbacks)
testPreUpdateExceptionDuringCommitWithNewFlushedInstance(org.apache.openjpa.persistence.callbacks.TestExceptionsFromCallbacks)

> @PreUpdate raised for new entities annotated with @EntityListeners
> ------------------------------------------------------------------
>
>                 Key: OPENJPA-1018
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-1018
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 1.2.0, 1.2.1, 1.3.0, 2.0.0
>         Environment: http://fisheye6.atlassian.com/browse/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java?r=761031
>            Reporter: Julien Kronegg
>   Original Estimate: 4h
>  Remaining Estimate: 4h
>
> Given the following entity:
>     @Entity
>     @EntityListeners({Auditing.class})
>     @Table(...)
>     public class A {
>       ...
>     }
> and the following Auditing class:
>     public class Auditing {
>       @PreUpdate
>       public void preUpdate(Object entity) { // the provided object is supposed to be
a PersistenceCapable
>         ...
>       }
>     }
> When using runtime enhancement, the PreUpdate event is raised and preUpdate(Object) is
called when persisting a new entity: the call is not expected as the entity is not yet persisted
(moreover, the entity passed in parameter is not an instance of PersistenceCapable). 
> This is due to StateManagerImpl.preFlush() lifecycle event firing conditions: 
>             // BEFORE_PERSIST is handled during Broker.persist and Broker.attach
>             if (isDeleted())
>                  fireLifecycleEvent(LifecycleEvent.BEFORE_DELETE);
>              else if (!(isNew() && !isFlushed())
>                                  && (ImplHelper.getUpdateFields(this) != null))
>                  fireLifecycleEvent(LifecycleEvent.BEFORE_UPDATE);
> When processing a PNewState, the condition for BEFORE_UPDATE event becomes simply: isFlushed(),
i.e. the BEFORE_UPDATE event is raised for a new Entity!  (stuff below is supposed to be a
boolean table, sorry for the loosy presentation):
>                                               isNew
>                                           true.....false
>     isFlushed.......true......fire.......fire
>                              false......X.........fire
> where X means "do nothing" and fire means "fire the BEFORE_UPDATE event".
> The correct full condition would include a condition to prevent raising BEFORE_UPDATE
for new entities:
>                                               isNew
>                                           true.....false
>     isFlushed.......true........X.........fire
>                              false......X.........fire
> where X means "do nothing" and fire means "fire the BEFORE_UPDATE event", which finally
gives:     
>       else if (!isNew() && (ImplHelper.getUpdateFields(this) != null))

-- 
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