Author: fancy
Date: Mon Jan 12 14:36:52 2009
New Revision: 733944

URL: http://svn.apache.org/viewvc?rev=733944&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.2.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.2.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.2.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.2.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.2.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.2.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.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractUpdateManager.java

Modified: 
openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractUpdateManager.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractUpdateManager.java?rev=733944&r1=733943&r2=733944&view=diff
==============================================================================
--- 
openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractUpdateManager.java
 (original)
+++ 
openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/AbstractUpdateManager.java
 Mon Jan 12 14:36:52 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);
     }
 


Reply via email to