[
https://issues.apache.org/jira/browse/OPENJPA-446?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12612890#action_12612890
]
Kevin Sutter commented on OPENJPA-446:
--------------------------------------
Nick,
Two things you can look at. One is the "fix versions". On this JIRA Issue,
the 1.0.2 version is listed as being a "fix version". The other thing you can
look at is the specific SVN Commits. The changes were put into the 1.0.x
release via svn revision #596737. The 1.0.2 release was tagged at revision
#628944. So, yes, this change has been put into the 1.0.2 release.
Kevin
> Problem when setting String fields of detached objects
> ------------------------------------------------------
>
> Key: OPENJPA-446
> URL: https://issues.apache.org/jira/browse/OPENJPA-446
> Project: OpenJPA
> Issue Type: Bug
> Components: jpa, kernel
> Affects Versions: 1.0.1
> Environment: OpenJPA 1.0.1
> Java 1.5.0_13
> MySQL Server 5.0
> MySQL Connector Java 5.0.6
> Reporter: Jonas Petersen
> Fix For: 1.0.2, 1.1.0
>
> Attachments: detach-attach-fix-proper.patch, detach-attach-fix.patch,
> DetachAttachTest-updated.zip, DetachAttachTest.zip
>
>
> I would like to report some strange behavior with detach and merge. To me it
> looks like a bug.
> I'm trying implement the following strategy:
>
> persistence context A:
> 1. get persistent object
> 2. detach the object
> no persistence context:
> 3. modify the (detached) object
> persistence context B:
> 4. attach (merge) the object
> This is quite simple and straight forward. It generally works except in one
> situation. When committing the merge() (step 4) an "optimistic locking error"
> is is thrown under the following condition: (step 3) a (String) field is set
> to the same text that it already contains but using a different String
> instance. In other words, when the following expressions are true:
>
> newString.equals(oldString)
> newString != oldString
> I have written some test code that reproduces this effect (see Attachment).
> The tests are using the same code except for one line:
> Test 1 sets the String to a different one than the object contains:
> record.setContent("a text different than the one in the record");
> Test 2 sets the String to the same instance the object contains:
> record.setContent(record.getContent());
> Test 3 sets the String to the same text but as a different String instance:
> record.setContent(record.getContent()+"");
> This is the result (output of the test run):
> ----------------------------------
> Test 1: SUCCESS
> Test 2: SUCCESS
> Test 3: FAILED (Optimistic locking errors were detected when flushing
> to the data store. The following objects may have been
> concurrently modified in another transaction:
> [test.Record-1])
> ----------------------------------
> While doing some debugging I noticed two things:
> 1. When setting the value:
> Class: org.apache.openjpa.kernel.DetachedStateManager
> Line: 555
> Method: settingStringField()
> if (cur == next || !_loaded.get(idx))
> return;
> Here the old and the new value (String) is compared with the == operator.
> The expression can be false with the same text (but different instances). I
> find this interesting as it matches exacly the problematic condition. I think
> an .equals() would fix the issue I am having. But I suppose there is
> something going wrong at another place as well.
> 2. Here is the point where execution splits into different ways when calling
> commit().
> Class: org.apache.openjpa.jdbc.kernel.AbstractUpdateManager
> Line: 151
> Method: populateRowManager()
> } else if ((dirty = ImplHelper.getUpdateFields(sm)) != null) {
> In the tests that succeed "ImplHelper.getUpdateFields(sm)" will return a
> BitSet. So the condition is true.
> In the tests that fail "ImplHelper.getUpdateFields(sm)" will return null. So
> the condition is false.
> Note: the problem persist with OpenJPA 1.1.0-SNAPSHOT. When run without
> enhancing the Record class, all tests will succeed though (printing this
> message „INFO [main] openjpa.Enhance - Creating subclass for "[class
> test.Record]". This means that your application will be less efficient and
> will consume more memory than it would if you ran the OpenJPA enhancer.
> Additionally, lazy loading will not be available for one-to-one and
> many-to-one persistent attributes in types using field access; they will be
> loaded eagerly instead.")
> Regards
> Jonas
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.