| Summary: | List order using @OrderColumn in OneToMany is not maintained when eclipselink.cache.shared.default=false | ||||||
|---|---|---|---|---|---|---|---|
| Product: | z_Archived | Reporter: | kalpana <kalpana.karun> | ||||
| Component: | Eclipselink | Assignee: | Nobody - feel free to take it <nobody> | ||||
| Status: | CLOSED DUPLICATE | QA Contact: | |||||
| Severity: | normal | ||||||
| Priority: | P3 | CC: | andrei.ilitchev | ||||
| Version: | unspecified | ||||||
| Target Milestone: | --- | ||||||
| Hardware: | PC | ||||||
| OS: | Windows XP | ||||||
| Whiteboard: | |||||||
| Attachments: |
|
||||||
Created attachment 180930 [details]
Testcase to reproduce the problem
*** This bug has been marked as a duplicate of bug 327940 *** The Eclipselink project has moved to Github: https://github.com/eclipse-ee4j/eclipselink |
Build Identifier: 2.0.1 We are using the @OrderBy annotation with @OneToMany where the List represents the many side. When the caching is disabled, order is not maintained in the list. Here are the details : a simplified test case[1] that demonstrates that a list read from db is not ordered if -<property name="eclipselink.cache.shared.default" value="false"/> is set in persistence.xml. The root cause seems to be that for queries on isolated descriptors, we use UOW instead of serversession to execute queries and then code in ReadAllQuery [2] results in a fork in code path that results in the sorting by OrderedListContainerPolicy (addAll()) not being executed. [1] To execute the test case, unzip the attached, adjust build.properties for your eclipselink workspace and test.properties for your database and then execute ant run (ant debug run to attach debuger) You will observe that on retrieval from database, the list is not ordered by the value of INDEX column. If you execute the same test case after modifying src/descriptor/persitence-javase.xml to enable shared cache, you will observe that the list is ordered. [2] Code from ReadAllQuery.executeObjectLevelReadQuery() if (this.session.isUnitOfWork()) { //we go here when shared cache is not being used result = registerResultInUnitOfWork(rows, (UnitOfWorkImpl)this.session, this.translationRow, true);// } else { //we go here when shared cache is being used result = this.containerPolicy.containerInstance(rows.size()); this.descriptor.getObjectBuilder().buildObjectsInto(this, rows, result); } Reproducible: Always Steps to Reproduce: How to run the test ------------------- -Edit build.properties to customize for your environment -Edit test.properties to customize for your database. At command line execute "ant run". This will build and execute the test. The testcase is attached