You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2009/09/29 05:31:34 UTC

svn commit: r819822 - in /openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats: AbstractFieldStrategy.java MapTableFieldStrategy.java RelationFieldStrategy.java

Author: faywang
Date: Tue Sep 29 03:31:34 2009
New Revision: 819822

URL: http://svn.apache.org/viewvc?rev=819822&view=rev
Log:
OPENJPA-1253: refactoring the checking of non-default mapping to AbstractFieldStrategy

Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/AbstractFieldStrategy.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MapTableFieldStrategy.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/AbstractFieldStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/AbstractFieldStrategy.java?rev=819822&r1=819821&r2=819822&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/AbstractFieldStrategy.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/AbstractFieldStrategy.java Tue Sep 29 03:31:34 2009
@@ -20,10 +20,14 @@
 
 import java.sql.SQLException;
 
+import org.apache.openjpa.conf.OpenJPAConfiguration;
 import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
 import org.apache.openjpa.jdbc.kernel.JDBCStore;
+import org.apache.openjpa.jdbc.meta.ClassMapping;
 import org.apache.openjpa.jdbc.meta.FieldMapping;
+import org.apache.openjpa.jdbc.meta.FieldMappingInfo;
 import org.apache.openjpa.jdbc.meta.FieldStrategy;
+import org.apache.openjpa.jdbc.schema.ForeignKey;
 import org.apache.openjpa.jdbc.sql.Joins;
 import org.apache.openjpa.jdbc.sql.Result;
 import org.apache.openjpa.jdbc.sql.RowManager;
@@ -32,6 +36,8 @@
 import org.apache.openjpa.jdbc.sql.SelectExecutor;
 import org.apache.openjpa.kernel.OpenJPAStateManager;
 import org.apache.openjpa.lib.util.Localizer;
+import org.apache.openjpa.meta.FieldMetaData;
+import org.apache.openjpa.meta.JavaTypes;
 import org.apache.openjpa.util.MetaDataException;
 
 /**
@@ -46,6 +52,13 @@
     private static final Localizer _loc = Localizer.forPackage
         (AbstractFieldStrategy.class);
 
+    private Boolean _isNonDefaultMappingAllowed = null;
+    private Boolean _isBi1ToMJT = null;
+    private Boolean _isUni1ToMFK = null;
+    private Integer _bi1ToMJT = null; //index of the field
+    private ForeignKey _bi_1ToM_JoinFK = null;
+    private ForeignKey _bi_1ToM_ElemFK = null;
+    
     /**
      * The owning field mapping.
      */
@@ -181,4 +194,107 @@
         Object prevValue)
         throws SQLException {
     }
+    
+    private void isNonDefaultMapping() {
+        FieldMapping mapped = field.getMappedByMapping();
+        _isBi1ToMJT = false;
+        _isUni1ToMFK = false;
+        if (isNonDefaultMappingAllowed()) {
+            if (field.getAssociationType() == FieldMetaData.ONE_TO_MANY ) {
+                if (mapped == null) {
+                    if (hasJoinTable())
+                        return;
+                    else if (hasJoinColumn()) {
+                        _isUni1ToMFK = true;
+                        return;
+                    }
+                } else {
+                    if (hasJoinTable()) {
+                        _isBi1ToMJT = true;
+                        return;
+                    } else if (hasJoinColumn()){
+                        return;
+                    }
+                }
+            }
+        }
+    }
+    
+    private boolean hasJoinColumn() {
+        boolean hasJoinColumn = (field.getValueInfo().getColumns().size() > 0 ? true : false);
+        return hasJoinColumn;
+    }
+    
+    private boolean hasJoinTable() {
+        boolean hasJoinTable = (field.getMappingInfo().getTableName() != null ? true : false);
+        return hasJoinTable;
+    }
+
+    public boolean isBi1ToMJT() {
+        if (_isBi1ToMJT == null)
+            isNonDefaultMapping();
+        return _isBi1ToMJT;
+    }
+    
+    public boolean isUni1ToMFK() {
+        if (_isUni1ToMFK == null)
+            isNonDefaultMapping();
+        return _isUni1ToMFK;
+    }
+
+    protected boolean isNonDefaultMappingAllowed() {
+        if (_isNonDefaultMappingAllowed == null) {
+            OpenJPAConfiguration conf = field.getRepository().getConfiguration();
+            _isNonDefaultMappingAllowed = field.getRepository().
+                getMetaDataFactory().getDefaults().isNonDefaultMappingAllowed(conf);
+        }
+        return _isNonDefaultMappingAllowed;
+    }
+
+    protected void getBiOneToManyInfo() {
+        _bi1ToMJT = -1;
+        if (!isNonDefaultMappingAllowed())
+            return;
+        ClassMapping inverse = field.getValueMapping().getTypeMapping();
+        FieldMapping[] fmds = inverse.getFieldMappings();
+        for (int i = 0; i < fmds.length; i++) {
+            if (field == fmds[i].getMappedByMapping()) {
+                int typeCode = fmds[i].getDeclaredTypeCode(); 
+                if (typeCode == JavaTypes.ARRAY ||
+                        typeCode == JavaTypes.COLLECTION ||
+                        typeCode == JavaTypes.MAP) {
+                    // this is a bi-directional oneToMany relation with
+                    // @JoinTable annotation ==> join table strategy
+                    // ==> should not mapped in the owner's table
+                    FieldMappingInfo info = fmds[i].getMappingInfo();
+                    if (info.getTableName() != null)
+                        _bi1ToMJT = i;
+                    _bi_1ToM_ElemFK = fmds[i].getElementMapping().getForeignKey();
+                    _bi_1ToM_JoinFK = fmds[i].getJoinForeignKey();
+                }
+                break;
+            } 
+        }
+    }
+
+    protected int getFieldIndexBi1ToMJT() {
+        if (_bi1ToMJT == null) {
+            getBiOneToManyInfo();
+        }
+        return _bi1ToMJT;
+    }
+    
+    protected ForeignKey getBi1ToMElemFK() {
+        if (_bi1ToMJT == null) {
+            getBiOneToManyInfo();
+        }
+        return _bi_1ToM_ElemFK;
+    }
+    
+    protected ForeignKey getBi1ToMJoinFK() {
+        if (_bi1ToMJT == null) {
+            getBiOneToManyInfo();
+        }
+        return _bi_1ToM_JoinFK;
+    }
 }

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MapTableFieldStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MapTableFieldStrategy.java?rev=819822&r1=819821&r2=819822&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MapTableFieldStrategy.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MapTableFieldStrategy.java Tue Sep 29 03:31:34 2009
@@ -66,51 +66,10 @@
     private static final Localizer _loc = Localizer.forPackage
         (MapTableFieldStrategy.class);
 
-    private Boolean _isNonDefaultMappingAllowed = null;
-    private Boolean _isBi1ToMJT = null;
-    private Boolean _isUni1ToMFK = null;
-
     public FieldMapping getFieldMapping() {
         return field;
     }
 
-    private void isNonDefaultMapping() {
-        FieldMapping mapped = field.getMappedByMapping();
-        if (isNonDefaultMappingAllowed() && 
-            field.getAssociationType() == FieldMetaData.ONE_TO_MANY &&
-            hasJoinColumnOrJoinTable()) {
-            if (mapped != null) {
-                _isBi1ToMJT = true;
-                _isUni1ToMFK = false;
-            } else {
-                _isBi1ToMJT = false;
-                _isUni1ToMFK = true;
-            }
-        } else {
-            _isBi1ToMJT = false;
-            _isUni1ToMFK = false;
-        }
-    }
-    
-    private boolean hasJoinColumnOrJoinTable() {
-        boolean hasJoinColumn = (field.getValueInfo().getColumns().size() > 0 ? true : false);
-        boolean hasJoinTable = (field.getMappingInfo().getTableName() != null ? true : false);
-        return hasJoinColumn || hasJoinTable;
-        
-    }
-    
-    public boolean isBi1ToMJT() {
-        if (_isBi1ToMJT == null)
-            isNonDefaultMapping();
-        return _isBi1ToMJT;
-    }
-    
-    public boolean isUni1ToMFK() {
-        if (_isUni1ToMFK == null)
-            isNonDefaultMapping();
-        return _isUni1ToMFK;
-    }
-
     public ClassMapping[] getIndependentKeyMappings(boolean traverse) {
         return (traverse) ? field.getKeyMapping().getIndependentTypeMappings()
             : ClassMapping.EMPTY_MAPPINGS;
@@ -161,15 +120,6 @@
         field.getValueInfo().assertNoSchemaComponents(field, !adapt);
     }
     
-    protected boolean isNonDefaultMappingAllowed() {
-        if (_isNonDefaultMappingAllowed == null) {
-            OpenJPAConfiguration conf = field.getRepository().getConfiguration();
-            _isNonDefaultMappingAllowed = field.getRepository().
-                getMetaDataFactory().getDefaults().isNonDefaultMappingAllowed(conf);
-        }
-        return _isNonDefaultMappingAllowed;
-    }
-
     public void delete(OpenJPAStateManager sm, JDBCStore store, RowManager rm)
         throws SQLException {
         Row row = rm.getAllRows(field.getTable(), Row.ACTION_DELETE);

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java?rev=819822&r1=819821&r2=819822&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java Tue Sep 29 03:31:34 2009
@@ -83,9 +83,6 @@
         (RelationFieldStrategy.class);
 
     private Boolean _fkOid = null;
-    private int _biOneToManyJoinTable = -1;
-    private ForeignKey _biOneToManyJoinFK = null;
-    private ForeignKey _biOneToManyElemFK = null;
     
     public void map(boolean adapt) {
         if (field.getTypeCode() != JavaTypes.PC || field.isEmbeddedPC())
@@ -139,11 +136,7 @@
             field.setUseClassCriteria(criteria);
             return;
         } else { // this could be the owner in a bi-directional relation
-            OpenJPAConfiguration conf = field.getRepository().getConfiguration();
-            boolean isNonDefaultMappingAllowed = field.getRepository().
-                getMetaDataFactory().getDefaults().isNonDefaultMappingAllowed(conf);
-            if (isNonDefaultMappingAllowed)  
-                getBiOneToManyInfo();
+            getBiOneToManyInfo();
         }
 
         // this is necessary to support openjpa 3 mappings, which didn't
@@ -168,7 +161,7 @@
             if (field.getMappedByIdValue() != null) 
                 setMappedByIdColumns();            
              
-            if (_biOneToManyJoinTable == -1) {
+            if (getFieldIndexBi1ToMJT() == -1) {
                 ForeignKey fk = vinfo.getTypeJoin(field, field.getName(), true,
                     adapt);
                 field.setForeignKey(fk);
@@ -279,7 +272,7 @@
             updateInverse(sm, rel, store, rm);
         else {
             Row row = field.getRow(sm, store, rm, Row.ACTION_INSERT);
-            if (row != null && _biOneToManyJoinTable == -1) {
+            if (row != null && getFieldIndexBi1ToMJT() == -1) {
                 field.setForeignKey(row, rel);
                 // this is for bi-directional maps, the key and value of the 
                 // map are stored in the table of the mapped-by entity  
@@ -346,6 +339,12 @@
             if (mapObj.get(key) == value)
                 return key;
         }
+        Set<Map.Entry> entries = mapObj.entrySet();
+        for (Map.Entry entry : entries) {
+            if (entry.getValue() == value)
+                return entry.getKey();
+        }
+     
         return null;
     }
 
@@ -365,29 +364,25 @@
                     field.isBidirectionalJoinTableMappingNonOwner()) ?
                     Row.ACTION_DELETE : Row.ACTION_UPDATE;
             Row row = field.getRow(sm, store, rm, action);
-            if (row != null && _biOneToManyJoinTable == -1) {
+            if (row != null && getFieldIndexBi1ToMJT() == -1) {
                 field.setForeignKey(row, rel);
                 // this is for bi-directional maps, the key and value of the 
                 // map are stored in the table of the mapped-by entity  
                 setMapKey(sm, rel, store, row);
             }
             
-            if (_biOneToManyJoinTable != -1) { // also need to update the join table
-                PersistenceCapable invPC = (PersistenceCapable)sm.fetchObject(_biOneToManyJoinTable);
+            if (getFieldIndexBi1ToMJT() != -1) { // also need to update the join table
+                PersistenceCapable invPC = (PersistenceCapable)sm.fetchObject(getFieldIndexBi1ToMJT());
                 Row secondaryRow = null;
                 if (invPC != null) {
-                    secondaryRow = rm.getSecondaryRow(_biOneToManyJoinFK.getTable(),
+                    secondaryRow = rm.getSecondaryRow(getBi1ToMJoinFK().getTable(),
                         Row.ACTION_INSERT);
-                    secondaryRow.setForeignKey(_biOneToManyElemFK, null, sm);
-                    secondaryRow.setForeignKey(_biOneToManyJoinFK, null, 
+                    secondaryRow.setForeignKey(getBi1ToMElemFK(), null, sm);
+                    secondaryRow.setForeignKey(getBi1ToMJoinFK(), null, 
                         RelationStrategies.getStateManager(invPC,
                         store.getContext()));
-                } else { 
-                    secondaryRow = rm.getSecondaryRow(_biOneToManyJoinFK.getTable(),
-                            Row.ACTION_DELETE);
-                    secondaryRow.setForeignKey(_biOneToManyElemFK, null, sm);
+                    rm.flushSecondaryRow(secondaryRow);
                 }
-                rm.flushSecondaryRow(secondaryRow);
             }
         }
     }
@@ -561,7 +556,7 @@
      */
     private void selectEagerParallel(Select sel, ClassMapping cls,
         JDBCStore store, JDBCFetchConfiguration fetch, int eagerMode) {
-        if (_biOneToManyJoinTable != -1)
+        if (getFieldIndexBi1ToMJT() != -1)
             return;
         sel.selectPrimaryKey(field.getDefiningMapping());
         // set a variable name that does not conflict with any in the query;
@@ -576,7 +571,7 @@
 
     public void selectEagerJoin(Select sel, OpenJPAStateManager sm,
         JDBCStore store, JDBCFetchConfiguration fetch, int eagerMode) {
-        if (_biOneToManyJoinTable != -1) 
+        if (getFieldIndexBi1ToMJT() != -1) 
             return;
 
         // limit the eager mode to single on recursive eager fetching b/c
@@ -681,7 +676,7 @@
     public void loadEagerJoin(OpenJPAStateManager sm, JDBCStore store,
         JDBCFetchConfiguration fetch, Result res)
         throws SQLException {
-        if (_biOneToManyJoinTable != -1)
+        if (getFieldIndexBi1ToMJT() != -1)
             return;
         ClassMapping cls = field.getIndependentTypeMappings()[0];
 
@@ -730,7 +725,7 @@
         // get the related object's oid
         ClassMapping relMapping = field.getTypeMapping();
         Object oid = null;
-        if (relMapping.isMapped() && _biOneToManyJoinTable == -1) { 
+        if (relMapping.isMapped() && getFieldIndexBi1ToMJT() == -1) { 
             oid = relMapping.getObjectId(store, res, field.getForeignKey(),
                     field.getPolymorphic() != ValueMapping.POLY_FALSE, null);
         } else {
@@ -796,16 +791,16 @@
                     sel.whereForeignKey(field.getForeignKey(rels[idx]),
                         sm.getObjectId(), field.getDefiningMapping(), store);
                 else {
-                    if (_biOneToManyJoinTable == -1) {
+                    if (getFieldIndexBi1ToMJT() == -1) {
                         resJoins[idx] = sel.newJoins().joinRelation(field.getName(),
                             field.getForeignKey(rels[idx]), rels[idx],
                             field.getSelectSubclasses(), false, false);
                         field.wherePrimaryKey(sel, sm, store);
                     } else {
                         resJoins[idx] = sel.newJoins().joinRelation(null,
-                            getBiOneToManyJoinFK(), rels[idx],
+                            getBi1ToMJoinFK(), rels[idx],
                             field.getSelectSubclasses(), false, false);
-                        sel.whereForeignKey(getBiOneToManyElemFK(), sm.getObjectId(), 
+                        sel.whereForeignKey(getBi1ToMElemFK(), sm.getObjectId(), 
                             field.getDefiningMapping(), store);
                     }
                 }
@@ -826,43 +821,6 @@
         }
     }
 
-    private ForeignKey getBiOneToManyJoinFK() {
-        if (_biOneToManyJoinFK == null) {
-            getBiOneToManyInfo();
-        }
-        return _biOneToManyJoinFK;
-    }
-    
-    private ForeignKey getBiOneToManyElemFK() {
-        if (_biOneToManyElemFK == null) {
-            getBiOneToManyInfo();
-        }
-        return _biOneToManyElemFK;
-    }
-
-    private void getBiOneToManyInfo() {
-        ClassMapping inverse = field.getValueMapping().getTypeMapping();
-        FieldMapping[] fmds = inverse.getFieldMappings();
-        for (int i = 0; i < fmds.length; i++) {
-            if (field == fmds[i].getMappedByMapping()) {
-                int typeCode = fmds[i].getDeclaredTypeCode(); 
-                if (typeCode == JavaTypes.ARRAY ||
-                        typeCode == JavaTypes.COLLECTION ||
-                        typeCode == JavaTypes.MAP) {
-                    // this is a bi-directional oneToMany relation with
-                    // @JoinTable annotation ==> join table strategy
-                    // ==> should not mapped in the owner's table
-                    FieldMappingInfo info = fmds[i].getMappingInfo();
-                    if (info.getTableName() != null)
-                        _biOneToManyJoinTable = i;
-                    _biOneToManyElemFK = fmds[i].getElementMapping().getForeignKey();
-                    _biOneToManyJoinFK = fmds[i].getJoinForeignKey();
-                }
-                break;
-            }
-        }
-    }
-    
     public Object toDataStoreValue(Object val, JDBCStore store) {
         return RelationStrategies.toDataStoreValue(field, val, store);
     }