[ https://issues.apache.org/jira/browse/OPENJPA-1018?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12704176#action_12704176 ] Michael Dick commented on OPENJPA-1018: --------------------------------------- I think I see the problem now. When you said runtime enhancement I thought you were using the javaagent [1]. Did you mean runtimeUnenhancedSubclasses [2] instead? [1] http://openjpa.apache.org/builds/latest/docs/manual/manual.html#ref_guide_pc_enhance_runtime_ex [2] http://openjpa.apache.org/builds/latest/docs/manual/manual.html#ref_guide_pc_enhance_unenhanced_types > @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.