Author: fancy
Date: Mon Jan 12 14:37:24 2009
New Revision: 733945
URL: http://svn.apache.org/viewvc?rev=733945&view=rev
Log:
OPENJPA-843 Unnecessary version update on inverse-side of a 1-m relationship
Committing patch provided by Dinkar Rao
Added:
openjpa/branches/1.3.x/openjpa-jdbc/src/test/java/org/apache/openjpa/jdbc/kernel/M21UniDepartment.java
- copied unchanged from r733932,
openjpa/trunk/openjpa-jdbc/src/test/java/org/apache/openjpa/jdbc/kernel/M21UniDepartment.java
openjpa/branches/1.3.x/openjpa-jdbc/src/test/java/org/apache/openjpa/jdbc/kernel/M21UniEmployee.java
- copied unchanged from r733932,
openjpa/trunk/openjpa-jdbc/src/test/java/org/apache/openjpa/jdbc/kernel/M21UniEmployee.java
openjpa/branches/1.3.x/openjpa-jdbc/src/test/java/org/apache/openjpa/jdbc/kernel/M21UniVersionTest.java
- copied unchanged from r733932,
openjpa/trunk/openjpa-jdbc/src/test/java/org/apache/openjpa/jdbc/kernel/M21UniVersionTest.java
openjpa/branches/1.3.x/openjpa-jdbc/src/test/java/org/apache/openjpa/jdbc/kernel/M2MBiDepartment.java
- copied unchanged from r733932,
openjpa/trunk/openjpa-jdbc/src/test/java/org/apache/openjpa/jdbc/kernel/M2MBiDepartment.java
openjpa/branches/1.3.x/openjpa-jdbc/src/test/java/org/apache/openjpa/jdbc/kernel/M2MBiEmployee.java
- copied unchanged from r733932,
openjpa/trunk/openjpa-jdbc/src/test/java/org/apache/openjpa/jdbc/kernel/M2MBiEmployee.java
openjpa/branches/1.3.x/openjpa-jdbc/src/test/java/org/apache/openjpa/jdbc/kernel/M2MBiVersionTest.java
- copied unchanged from r733932,
openjpa/trunk/openjpa-jdbc/src/test/java/org/apache/openjpa/jdbc/kernel/M2MBiVersionTest.java
Modified:
openjpa/branches/1.3.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractUpdateManager.java
Modified:
openjpa/branches/1.3.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractUpdateManager.java
URL:
http://svn.apache.org/viewvc/openjpa/branches/1.3.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractUpdateManager.java?rev=733945&r1=733944&r2=733945&view=diff
==============================================================================
---
openjpa/branches/1.3.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractUpdateManager.java
(original)
+++
openjpa/branches/1.3.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractUpdateManager.java
Mon Jan 12 14:37:24 2009
@@ -144,7 +144,7 @@
customs);
} else if ((dirty = ImplHelper.getUpdateFields(sm)) != null) {
update(sm, dirty, (ClassMapping) sm.getMetaData(), rowMgr,
- store, customs);
+ store, customs, false);
} else if (sm.isVersionUpdateRequired()) {
updateIndicators(sm, (ClassMapping) sm.getMetaData(), rowMgr,
store, customs, true);
@@ -268,7 +268,7 @@
*/
protected void update(OpenJPAStateManager sm, BitSet dirty,
ClassMapping mapping, RowManager rowMgr, JDBCStore store,
- Collection customs) throws SQLException {
+ Collection customs, boolean updateIndicators) throws SQLException {
Boolean custom = mapping.isCustomUpdate(sm, store);
if (!Boolean.FALSE.equals(custom))
mapping.customUpdate(sm, store);
@@ -279,17 +279,38 @@
// detect whether any fields in their rows have been modified
FieldMapping[] fields = mapping.getDefinedFieldMappings();
for (int i = 0; i < fields.length; i++) {
- if (dirty.get(fields[i].getIndex())
- && !bufferCustomUpdate(fields[i], sm, store, customs)) {
- fields[i].update(sm, store, rowMgr);
+ FieldMapping field = fields[i];
+ if (dirty.get(field.getIndex())
+ && !bufferCustomUpdate(field, sm, store, customs)) {
+ field.update(sm, store, rowMgr);
+ if (!updateIndicators) {
+ FieldMapping[] inverseFieldMappings =
+ field.getInverseMappings();
+ if (inverseFieldMappings.length == 0) {
+ updateIndicators = true;
+ }
+ else {
+ for (FieldMapping inverseFieldMapping :
+ inverseFieldMappings) {
+ if (inverseFieldMapping.getMappedBy() != null) {
+ updateIndicators = true;
+ break;
+ }
+ }
+ }
+ }
}
}
ClassMapping sup = mapping.getJoinablePCSuperclassMapping();
- if (sup == null)
- updateIndicators(sm, mapping, rowMgr, store, customs, false);
+ if (sup == null) {
+ if (updateIndicators) {
+ updateIndicators(sm, mapping, rowMgr, store, customs, false);
+ }
+ }
else
- update(sm, dirty, sup, rowMgr, store, customs);
+ update(sm, dirty, sup, rowMgr, store, customs, updateIndicators);
+
mapping.update(sm, store, rowMgr);
}