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/21 22:21:51 UTC
svn commit: r817399 - in /openjpa/trunk:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/
openjpa-persistence-jdbc/src/tes...
Author: faywang
Date: Mon Sep 21 20:21:50 2009
New Revision: 817399
URL: http://svn.apache.org/viewvc?rev=817399&view=rev
Log:
OPENJPA-1253: support non-default uni-directional OneToMany mapping using foreign key strategy.
Modified:
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/Column.java
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/PrimaryRow.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/TestSpecCompatibilityOptions.java
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java?rev=817399&r1=817398&r2=817399&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java Mon Sep 21 20:21:50 2009
@@ -42,6 +42,7 @@
import org.apache.openjpa.kernel.StoreContext;
import org.apache.openjpa.lib.log.Log;
import org.apache.openjpa.lib.util.Localizer;
+import org.apache.openjpa.meta.FieldMetaData;
import org.apache.openjpa.meta.JavaTypes;
import org.apache.openjpa.util.ChangeTracker;
import org.apache.openjpa.util.InternalException;
@@ -63,6 +64,7 @@
private boolean _orderInsert = false;
private boolean _orderUpdate = false;
+ private boolean _uni1MFK = false;
protected ClassMapping[] getIndependentElementMappings(boolean traverse) {
return field.getElementMapping().getIndependentTypeMappings();
@@ -153,10 +155,20 @@
field.setOrderColumnIO(finfo.getColumnIO());
}
return;
+ } else {
+ if (field.getValueInfo().getColumns().size() > 0 &&
+ field.getAccessType() == FieldMetaData.ONE_TO_MANY) {
+ _uni1MFK = true;
+ }
}
// map inverse foreign key in related table
ForeignKey fk = vinfo.getInverseTypeJoin(elem, field.getName(), adapt);
+ if (_uni1MFK) {
+ Column[] locals = fk.getColumns();
+ for (int i = 0; i < locals.length; i++)
+ locals[i].setUni1MFK(true);
+ }
elem.setForeignKey(fk);
elem.setColumnIO(vinfo.getColumnIO());
elem.setColumns(elem.getTypeMapping().getPrimaryKeyColumns());
Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/Column.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/Column.java?rev=817399&r1=817398&r2=817399&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/Column.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/Column.java Mon Sep 21 20:21:50 2009
@@ -75,6 +75,7 @@
private VersionStrategy _versionStrategy = null;
private String _comment = null;
private boolean _XML = false;
+ private boolean _isUni1MFK = false;
/**
* Default constructor.
@@ -733,6 +734,8 @@
_flags = from._flags;
if (!isXML())
setXML(from.isXML());
+ if (!isUni1MFK())
+ setUni1MFK(from.isUni1MFK());
}
/**
@@ -792,4 +795,26 @@
public void setImplicitRelation(boolean flag) {
_implicitRelation |= flag;
}
+
+ /**
+ * Sets a marker to indicate that this instance represents a uni-directional
+ * one to many relation using the foreign key strategy. This non-default
+ * mapping of uni-directional one-to-many is supported in JPA 2.0.
+ *
+ * @since 2.0
+ */
+ public boolean isUni1MFK() {
+ return _isUni1MFK;
+ }
+
+ /**
+ * Affirms if this instance represents a uni-directional one to many relation
+ * using the foreign key strategy. This non-default mapping of uni-directional
+ * one-to-many is supported in JPA 2.0.
+ *
+ * @since 2.0
+ */
+ public void setUni1MFK(boolean isUni1MFK) {
+ _isUni1MFK = isUni1MFK;
+ }
}
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=817399&r1=817398&r2=817399&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 Mon Sep 21 20:21:50 2009
@@ -361,8 +361,8 @@
* is a default value or was not set and the column is not a primary key.
*/
boolean allowsUpdate(Column col, Object old, Object cur) {
- return !col.isPrimaryKey() && col.isImplicitRelation()
- && (isDefaultValue(old));
+ return ((!col.isPrimaryKey() && col.isImplicitRelation()) ||
+ col.isUni1MFK()) && (isDefaultValue(old));
}
boolean isDefaultValue(Object val) {
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/TestSpecCompatibilityOptions.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/TestSpecCompatibilityOptions.java?rev=817399&r1=817398&r2=817399&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/TestSpecCompatibilityOptions.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/TestSpecCompatibilityOptions.java Mon Sep 21 20:21:50 2009
@@ -221,22 +221,34 @@
cs.add(c1);
em.persist(c1);
em.getTransaction().commit();
+
+ // update by removing a c and then add this c to a new u
+ em.getTransaction().begin();
+ EntityC_U1MFK c2 = cs.remove(0);
+
+ Uni_1ToM_FK u2 = new Uni_1ToM_FK();
+ u2.setName("uni1mfk2");
+ List<EntityC_U1MFK> cs2 = new ArrayList<EntityC_U1MFK>();
+ cs2.add(c2);
+ u2.setEntityCs(cs2);
+ em.persist(u2);
+ em.getTransaction().commit();
em.clear();
//query
- Query q = em.createQuery("SELECT u FROM Uni_1ToM_FK u");
+ Query q = em.createQuery("SELECT u FROM Uni_1ToM_FK u where u.name = 'newName'");
Uni_1ToM_FK u1 = (Uni_1ToM_FK)q.getSingleResult();
assertEquals(u, u1);
em.clear();
//find
long id = u1.getId();
- Uni_1ToM_FK u2 = em.find(Uni_1ToM_FK.class, id);
- assertEquals(u, u2);
+ Uni_1ToM_FK findU1 = em.find(Uni_1ToM_FK.class, id);
+ assertEquals(findU1, u1);
//remove
em.getTransaction().begin();
- em.remove(u2);
+ em.remove(findU1);
em.getTransaction().commit();
em.clear();
}