Details
-
Bug
-
Status: Open
-
Major
-
Resolution: Unresolved
-
1.2.0, 1.2.1, 1.3.0, 2.0.0-M2
-
None
-
None
-
http://fisheye6.atlassian.com/browse/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java?r=761031
IBM J9 VM 1.5.0, deployed as standalone Java application or as Websphere 6.1 WAR
Description
Given the following entity:
@Entity
@EntityListeners(
)
@Table(...)
public class A
and the following Auditing class:
public class Auditing {
@PreUpdate
public void preUpdate(Object entity)
}
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))
Attachments
Issue Links
- relates to
-
OPENJPA-754 Un-scheduled pre/postUpdate callbacks from persist.
- Closed