[
https://issues.apache.org/jira/browse/OPENJPA-1873?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12932684#action_12932684
]
Mark Struberg commented on OPENJPA-1873:
----------------------------------------
Hi Pinaki!
The test contains a test entity PostLoadListenerEntity.
This entity contains a field 'value' which I use in the test.
If you add ONE single other value to the entity, the Object in the @PostLoad
listener has a different value.
Please comment out value2 to value12 in this entity (only id and value enabled)
and rerun the test - it will pass now.
Then comment value2 or any other additional field back in -> the test will fail.
This is really inconsistent and should get fixed
Btw I do not agree with you on the value of the @PostLoad data.
The spec says:
3.5.2
"The PostLoad method for an entity is invoked after the entity has been loaded
into the current persis-
tence context from the database or after the refresh operation has been applied
to it."
and for the merge:
3.1.1 "Merge the state of the given entity into the current persistence
context."
3.2.7.1 "The merge operation allows for the propagation of state from detached
entities onto persistent entities managed by the entity manager." + "If X is a
detached entity, the state of X is copied onto a pre-existing managed entity
instance X' of the same identity or a new managed copy X' of X is created."
I interpret this that the value we need to hand to the @PostLoad method ist
per spec the state of the entity _before_ the merge.
The only thing we imo can take into question is if the @PostLoad needs to get
called at all. Section 3.2.7 at least gives a few answers where we for sure do
not need to load it - but 3.2.7.1 imo says that we should for merging detached
entities:
3.2 "A managed entity instance is an instance with a persistent identity that
is currently associated with a persistence context."
Of course you can say we don't need to go to the database to ensure the
'managed entity' has a 'persistent identity' but then you will fail if the
database has been changed outside your application. Thus a load from the
database is really required.
I know that we only need to do what the spec says and not what any other JPA
implementation does. But if 3 other major JPA impls act this way, than it might
be a strong indicator at least ;)
txs and LieGrue,
strub
> EntityManager#merge sometimes passes wrong entity values to @PostLoad
> EntityListeners
> --------------------------------------------------------------------------------------
>
> Key: OPENJPA-1873
> URL: https://issues.apache.org/jira/browse/OPENJPA-1873
> Project: OpenJPA
> Issue Type: Bug
> Components: kernel
> Affects Versions: 2.0.0, 2.0.1, 2.0.2
> Reporter: Mark Struberg
> Attachments: OPENJPA-1873-unittest.patch, postloadtest.zip
>
>
> I've tested this with the latest from branches/2.0.x.
> My entity has an @EntityListeners which observes the @PostLoad lifecycle
> event. This listener stores the 'old' values from the database for later use
> (see http://struberg.wordpress.com/2010/07/31/howto-changelog-with-jpa/ for
> the intention behind). All works well if the table has only a few rows. But
> if you add more rows, OpenJPA tries to optimize the access and only loads the
> @Version field + the dirty fields. In this case the merging seems to be
> wrong, because I get the NEW values from the dirty fields instead of the
> original values from the database passed to my @PostLoad method.
> Did cost me a few grey hairs to track down the differences between the
> working and the broken scenarios here ;) But finally I was able to creat a
> unit test showing the problem
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.