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,
> >
> >
> >