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