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

Julien Kronegg commented on OPENJPA-1018:
-----------------------------------------

I tested using the following code:

    EntityManager em;
    // ... create the EntityManager
    MyEntity entity = new MyEntity(); // entity annotated with @PrePersist and 
@PreUpdate
    // ... fill the entity fields
    em.getTransaction().begin();
    em.persist(entity);
    em.getTransaction().commit();

My persistence.xml file contains the <class>myPackage.MyEntity</class>.

When running the example above using runtime enhancement, both PrePersist and 
PreUpdate events are raised (expected: only PrePersist should be raised).
But when running the example above using the "-javaagent:lib/openjpa.jar" JVM 
option, only the PrePersist event is raised (this is the expected result).

So it seems this is a problem with the runtime enhancement process.

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

Reply via email to