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, <[email protected]> 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, > > >
