[
https://issues.apache.org/jira/browse/OPENJPA-1018?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12704088#action_12704088
]
Julien Kronegg commented on OPENJPA-1018:
-----------------------------------------
About a testcase: TestEntityListener tests [1] should fail when the
EntityListenerEntity or GlobalListenerEntity are enhanced at runtime.
[1]
http://fisheye6.atlassian.com/browse/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/callbacks/TestEntityListeners.java?r=757278
> @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.