[ 
https://issues.apache.org/jira/browse/OPENJPA-1873?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12932653#action_12932653
 ] 

Pinaki Poddar commented on OPENJPA-1873:
----------------------------------------

Mark,
  1. is the attached test in PostLoadTest.zip supposed to pass or fail?

  you wrote:
> Fact: a @PostLoad must get called after loading from the database. Thus I'd 
> say that it needs to get called even if entities only got loaded partly. 
  I tend of agree. The notion of 'loaded partly' does not exist in the spce -- 
it is an implementation issue. 
 However, my view is that the lifecycle callback methods are tied to instance 
life cycle state transitions and not directly to operational  methods such as 
find() or merge(). Of course, an operational method may cause a life cycle 
state transition. For example, a PostLoad callback is invoked when an entity 
state is loaded from the database. But whether a merge() operation will cause 
an entity state be loaded from database or not can vary based on other factors. 
Hence a question such as "does merge() must invoke postLoad()?" may not offer a 
definite answer. "Vendor X invoked postLoad() on merge()" -- is not convincing 
enough  for me. 


> But the spec also defines that the _entity_ from the db needs to get posted. 

   Can you please elaborate this point? Are you suggesting that the state of 
the argument instance of postLoad() method should represent the database 
values? If that is the case, then I do not agree. The postLoad() will see the 
state of the instance *after* the provider has loaded the instance in to its 
context -- some of the properties can come from the database, some can come 
from the user-supplied instance  -- but the state as presented to the 
postLoad() method argument must be 'consistent' -- meaning it must be the exact 
same state that the persistence context holds and will eventually be committed 
if nothing changes further.

> Currently we get a mix between old and new values in @PostLoad which (I think 
> we agree) is wrong. 

  Such a mix, if proven, is inconsistent.  But I could not see how the test you 
have submitted exposes such inconsistent behavior. 





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

Reply via email to