Simple Select generates extra SQL statements to populate Entities
-----------------------------------------------------------------
Key: OPENJPA-1188
URL: https://issues.apache.org/jira/browse/OPENJPA-1188
Project: OpenJPA
Issue Type: Bug
Components: kernel
Affects Versions: 1.2.1, 1.2.0, 1.1.0, 1.0.3, 1.0.2, 1.0.1, 1.0.0, 1.0.4,
1.0.5, 1.1.1, 1.2.2, 1.3.0, 2.0.0-M1, 2.0.0-M2, 2.0.0
Reporter: Kevin Sutter
This JIRA is the result of a discussion on our users forum:
http://n2.nabble.com/openJPA-generates-select-per-row---impossible-to-use-for-simple-select-statements-td3261512.html#a3261512
Mikhail was very helpful (and patient) with helping to reproduce the problem.
I will be posting a testcase patch very soon. The actual fix may be left up to
a potential contributor or committer... :-)
Requirements...
o Your Entity needs to have an attribute that OpenJPA wrappers with a proxy.
This proxy is used to detect changes to these object types. Example object
types that OpenJPA wrappers are Calendar (culprit for this scenario), Date,
Collection, and Map.
o In the Setter method for the proxied attribute, you must modify the value
getting set. In this scenario, the Calendar object was being modified in the
setDate method via the set() method.
o The Entity must be using property-based access (annotations on the Getter
methods).
o The Persistence Context must be clear of any Entities that are being
queried. For example, my testcase was persisting several Entities before
executing the Query that was supposedly generating the extra SQL statements.
If I didn't clear the Persistence Context before executing the Query, the
Entities were already populated and it didn't trigger the extra SQL statements.
o And, now comes the magic... :-) Access to the attribute's meta data seems
to be done alphabetically. From what I can tell, this seems to be a Java
format convention. In any case, the extra SQL statements are used to
re-populate any attributes that are alphabetically after the proxied attribute
that was modified in the corresponding Setter method.
Given all of that setup, here's an explanation of what's happening...
After the initial query is executed, the resulting Entity objects need to be
populated with the data returned by the query. When the setter was called for
this proxied attribute, and the value was modified, this attribute (and the
Entity) was marked as being "dirty". Part of the dirty processing is to
determine which fields need to be re-loaded. Of course, the proxied attribute
does not have to be re-loaded since it was in the process of being modified.
The id field does not have to re-loaded since we're using id generation for
this particular scenario. And, any fields that are alphabetically before the
proxied attribute were just loaded, so they don't have to be re-loaded. But,
any fields that come after the proxied attribute (alphabetically) don't realize
that they will be loaded (due to the original query), so the extra SQL is
pushed out to load these fields.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.