You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by Fay Wang <fy...@yahoo.com> on 2009/02/06 19:43:56 UTC

Re: svn commit: r741595 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-kernel/src/main/java/org/apache/openjpa/meta/ openjpa-persistence/src/main/ja

Hi Jeremy, 
I will check in the test case later on. 
 
Regards,
Fay


--- On Fri, 2/6/09, Jeremy Bauer <te...@gmail.com> wrote:

> From: Jeremy Bauer <te...@gmail.com>
> Subject: Re: svn commit: r741595 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/  openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-kernel/src/main/java/org/apache/openjpa/meta/  openjpa-persistence/src/main/ja
> To: dev@openjpa.apache.org, faywang@apache.org
> Date: Friday, February 6, 2009, 8:29 AM
> Hi Fay,
> 
> Do you have corresponding tests to go along with this
> commit?  I find that
> it makes reviewing simpler and more complete if the test
> code gets committed
> along with the function.
> 
> -Jeremy
> 
> On Fri, Feb 6, 2009 at 9:34 AM, <fa...@apache.org>
> wrote:
> 
> > Author: faywang
> > Date: Fri Feb  6 15:34:53 2009
> > New Revision: 741595
> >
> > URL:
> http://svn.apache.org/viewvc?rev=741595&view=rev
> > Log:
> > OPENJPA-871: MappedById support
> >
> > Modified:
> >
> > 
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/HandlerRelationMapTableFieldStrategy.java
> >
> > 
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java
> >
> > 
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PrimaryRow.java
> >
> > 
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java
> >
> > 
> openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
> >
> > 
> openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/MetaDataTag.java
> >
> > Modified:
> >
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/HandlerRelationMapTableFieldStrategy.java
> > URL:
> >
> http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/HandlerRelationMapTableFieldStrategy.java?rev=741595&r1=741594&r2=741595&view=diff
> >
> >
> ==============================================================================
> > ---
> >
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/HandlerRelationMapTableFieldStrategy.java
> > (original)
> > +++
> >
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/HandlerRelationMapTableFieldStrategy.java
> > Fri Feb  6 15:34:53 2009
> > @@ -139,19 +139,12 @@
> >         if (val.getTypeCode() != JavaTypes.PC ||
> val.isEmbeddedPC())
> >             throw new
> MetaDataException(_loc.get("not-relation", val));
> >         FieldMapping mapped =
> field.getMappedByMapping();
> > -        String keyName = null;
> > -        _kio = new ColumnIO();
> > -        if (mapped != null) { // map to the owner
> table
> > -            keyName = field.getName() +
> "_KEY";
> > -            _kcols = HandlerStrategies.map(key,
> keyName, _kio, adapt);
> > +
> > +        if (mapped != null) // map to the owner table
> >             handleMappedBy(adapt);
> > -        } else {
> > +        else {
> >             // map to a separate table
> >             field.mapJoin(adapt, true);
> > -            DBDictionary dict =
> > field.getMappingRepository().getDBDictionary();
> > -            keyName =
> dict.getValidColumnName("key", field.getTable());
> > -            _kcols = HandlerStrategies.map(key,
> keyName, _kio, adapt);
> > -
> >             if (val.getTypeMapping().isMapped()) {
> >                 ValueMappingInfo vinfo =
> val.getValueInfo();
> >                 ForeignKey fk = vinfo.getTypeJoin(val,
> "value", false,
> > adapt);
> > @@ -162,6 +155,10 @@
> >
> >             val.mapConstraints("value",
> adapt);
> >         }
> > +        _kio = new ColumnIO();
> > +        DBDictionary dict =
> > field.getMappingRepository().getDBDictionary();
> > +        _kcols = HandlerStrategies.map(key,
> > +            dict.getValidColumnName("key",
> field.getTable()), _kio,
> > adapt);
> >
> >         field.mapPrimaryKey(adapt);
> >     }
> >
> > 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=741595&r1=741594&r2=741595&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
> > Fri Feb  6 15:34:53 2009
> > @@ -19,7 +19,9 @@
> >  package org.apache.openjpa.jdbc.meta.strats;
> >
> >  import java.sql.SQLException;
> > +import java.util.ArrayList;
> >  import java.util.HashMap;
> > +import java.util.List;
> >  import java.util.Map;
> >  import java.util.Set;
> >
> > @@ -35,6 +37,7 @@
> >  import org.apache.openjpa.jdbc.meta.Joinable;
> >  import org.apache.openjpa.jdbc.meta.MappingInfo;
> >  import org.apache.openjpa.jdbc.meta.ValueMapping;
> > +import org.apache.openjpa.jdbc.meta.ValueMappingImpl;
> >  import org.apache.openjpa.jdbc.meta.ValueMappingInfo;
> >  import org.apache.openjpa.jdbc.schema.Column;
> >  import org.apache.openjpa.jdbc.schema.ColumnIO;
> > @@ -151,6 +154,9 @@
> >
> >         field.mapJoin(adapt, false);
> >         if (field.getTypeMapping().isMapped()) {
> > +            if (field.getMappedByIdValue() != null)
> > +                setMappedByIdColumns();
> > +
> >             ForeignKey fk = vinfo.getTypeJoin(field,
> field.getName(), true,
> >                 adapt);
> >             field.setForeignKey(fk);
> > @@ -178,6 +184,44 @@
> >     }
> >
> >     /**
> > +     * When there is MappedById annotation, the owner
> of the one-to-one/
> > +     * many-to-one relationship will use its primary
> key to represent
> > +     * foreign key relation. No need to create a
> separate foreign key
> > +     * column.
> > +     */
> > +    private void setMappedByIdColumns() {
> > +        ClassMetaData owner =
> field.getDefiningMetaData();
> > +        FieldMetaData[] pks =
> owner.getPrimaryKeyFields();
> > +        for (int i = 0; i < pks.length; i++) {
> > +            FieldMapping fm = (FieldMapping) pks[i];
> > +            ValueMappingImpl val = (ValueMappingImpl)
> field.getValue();
> > +            ValueMappingInfo info =
> val.getValueInfo();
> > +           
> info.setColumns(getMappedByIdColumns(fm));
> > +        }
> > +    }
> > +
> > +    private List getMappedByIdColumns(FieldMapping
> pk) {
> > +        ClassMetaData embeddedId =
> >
> ((ValueMappingImpl)pk.getValue()).getEmbeddedMetaData();
> > +        Column[] pkCols = null;
> > +        if (embeddedId != null) {
> > +            FieldMetaData[] fmds =
> embeddedId.getFields();
> > +            for (int i = 0; i < fmds.length; i++)
> {
> > +                if
> (fmds[i].getName().equals(field.getMappedByIdValue()))
> > {
> > +                    pkCols =
> >  ((ValueMappingImpl)fmds[i].getValue()).getColumns();
> > +                    break;
> > +                }
> > +            }
> > +        }
> > +        List cols = new ArrayList();
> > +        for (int i = 0; i < pkCols.length; i++) {
> > +            Column newCol = new Column();
> > +            newCol.setName(pkCols[i].getName());
> > +            cols.add(newCol);
> > +        }
> > +        return cols;
> > +    }
> > +
> > +    /**
> >      * Return whether our defining mapping is an
> unjoined subclass of
> >      * the type of the given value.
> >      */
> >
> > Modified:
> >
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PrimaryRow.java
> > URL:
> >
> http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PrimaryRow.java?rev=741595&r1=741594&r2=741595&view=diff
> >
> >
> ==============================================================================
> > ---
> >
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PrimaryRow.java
> > (original)
> > +++
> >
> openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PrimaryRow.java
> > Fri Feb  6 15:34:53 2009
> > @@ -346,6 +346,10 @@
> >                                        (prev == null)
> ? null :
> > prev.getClass(), prev,
> >                                        (val == null) ?
> null :
> > val.getClass(), val })).
> >                                        setFatal(true);
> > +               } else {
> > +                   // since not allow to update and
> the new value is 0 or
> > null,
> > +                   // just return.
> > +                   return;
> >                }
> >             }
> >         }
> >
> > Modified:
> >
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java
> > URL:
> >
> http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java?rev=741595&r1=741594&r2=741595&view=diff
> >
> >
> ==============================================================================
> > ---
> >
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java
> > (original)
> > +++
> >
> openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java
> > Fri Feb  6 15:34:53 2009
> > @@ -142,6 +142,7 @@
> >     private String _fullName = null;
> >     private String _embedFullName = null;
> >     private int _resMode = MODE_NONE;
> > +    private String _mappedByIdValue = null;
> >
> >     // load/store info
> >     private String[] _comments = null;
> > @@ -2155,4 +2156,12 @@
> >     public void setElementCollection(boolean
> isElementCollection) {
> >         this._isElementCollection =
> isElementCollection;
> >     }
> > +
> > +    public String getMappedByIdValue() {
> > +        return _mappedByIdValue;
> > +    }
> > +
> > +    public void setMappedByIdValue(String
> mappedByIdValue) {
> > +        this._mappedByIdValue = mappedByIdValue;
> > +    }
> >  }
> >
> > Modified:
> >
> openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
> > URL:
> >
> http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java?rev=741595&r1=741594&r2=741595&view=diff
> >
> >
> ==============================================================================
> > ---
> >
> openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
> > (original)
> > +++
> >
> openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
> > Fri Feb  6 15:34:53 2009
> > @@ -60,6 +60,7 @@
> >  import javax.persistence.ManyToOne;
> >  import javax.persistence.MapKey;
> >  import javax.persistence.MapKeyClass;
> > +import javax.persistence.MappedById;
> >  import javax.persistence.MappedSuperclass;
> >  import javax.persistence.NamedNativeQueries;
> >  import javax.persistence.NamedNativeQuery;
> > @@ -145,6 +146,7 @@
> >         _tags.put(IdClass.class, ID_CLASS);
> >         _tags.put(MapKey.class, MAP_KEY);
> >         _tags.put(MapKeyClass.class, MAP_KEY_CLASS);
> > +        _tags.put(MappedById.class, MAPPED_BY_ID);
> >         _tags.put(NamedNativeQueries.class,
> NATIVE_QUERIES);
> >         _tags.put(NamedNativeQuery.class,
> NATIVE_QUERY);
> >         _tags.put(NamedQueries.class, QUERIES);
> > @@ -1062,6 +1064,9 @@
> >                 case EMBEDDED_ID:
> >                     fmd.setPrimaryKey(true);
> >                     break;
> > +                case MAPPED_BY_ID:
> > +                    parseMappedById(fmd,
> (MappedById)anno);
> > +                    break;
> >                 case MAP_KEY:
> >                     if (isMappingOverrideMode())
> >                         parseMapKey(fmd, (MapKey)
> anno);
> > @@ -1419,6 +1424,17 @@
> >     }
> >
> >     /**
> > +     * Parse @MappedById.
> > +     */
> > +    private void parseMappedById(FieldMetaData fmd,
> MappedById anno) {
> > +        String value = anno.value();
> > +        if (value != null)
> > +            fmd.setMappedByIdValue(value);
> > +        else
> > +            fmd.setMappedByIdValue("");
> > +    }
> > +
> > +    /**
> >      * Setup the field as a LOB mapping.
> >      */
> >     protected void parseLobMapping(FieldMetaData fmd)
> {
> >
> > Modified:
> >
> openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/MetaDataTag.java
> > URL:
> >
> http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/MetaDataTag.java?rev=741595&r1=741594&r2=741595&view=diff
> >
> >
> ==============================================================================
> > ---
> >
> openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/MetaDataTag.java
> > (original)
> > +++
> >
> openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/MetaDataTag.java
> > Fri Feb  6 15:34:53 2009
> > @@ -45,6 +45,7 @@
> >     LOB,
> >     MAP_KEY,
> >     MAP_KEY_CLASS,
> > +    MAPPED_BY_ID,
> >     NATIVE_QUERIES,
> >     NATIVE_QUERY,
> >     QUERY_STRING,
> >
> >
> >