You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by aw...@apache.org on 2006/10/07 00:31:31 UTC
svn commit: r453796 - in /incubator/openjpa/trunk:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/
openjpa-kernel/src/ma...
Author: awhite
Date: Fri Oct 6 15:31:28 2006
New Revision: 453796
URL: http://svn.apache.org/viewvc?view=rev&rev=453796
Log:
Merge fixes from Kodo 4.0 line.
Modified:
incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingInfo.java
incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java
incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ColumnIO.java
incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ForeignKey.java
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java
incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/meta/XMLMetaDataParser.java
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingInfo.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingInfo.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingInfo.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingInfo.java Fri Oct 6 15:31:28 2006
@@ -1634,7 +1634,7 @@
if (col.getDefaultString() != null)
copy.setDefaultString(col.getDefaultString());
if (col.isNotNull() && !col.isPrimaryKey()
- && !isPrimitive(col.getJavaType()))
+ && (!isPrimitive(col.getJavaType()) || isForeignKey(col)))
copy.setNotNull(true);
// set type name if not default
@@ -1672,6 +1672,21 @@
copy.setType(col.getType());
return copy;
+ }
+
+ /**
+ * Return whether the given column belongs to a foreign key.
+ */
+ private static boolean isForeignKey(Column col)
+ {
+ if (col.getTable() == null)
+ return false;
+ ForeignKey[] fks = col.getTable().getForeignKeys();
+ for (int i = 0; i < fks.length; i++)
+ if (fks[i].containsColumn(col)
+ || fks[i].containsConstantColumn(col))
+ return true;
+ return false;
}
/**
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java Fri Oct 6 15:31:28 2006
@@ -180,7 +180,7 @@
OpenJPAStateManager rel = RelationStrategies.getStateManager
(sm.fetchObjectField(field.getIndex()), store.getContext());
if (field.getJoinDirection() == field.JOIN_INVERSE)
- updateInverse(sm, rel, store, rm, sm);
+ updateInverse(sm, rel, store, rm);
else {
Row row = field.getRow(sm, store, rm, Row.ACTION_INSERT);
if (row != null)
@@ -198,7 +198,7 @@
if (field.getJoinDirection() == field.JOIN_INVERSE) {
nullInverse(sm, rm);
- updateInverse(sm, rel, store, rm, sm);
+ updateInverse(sm, rel, store, rm);
} else {
Row row = field.getRow(sm, store, rm, Row.ACTION_UPDATE);
if (row != null)
@@ -215,7 +215,7 @@
if (sm.getLoaded().get(field.getIndex())) {
OpenJPAStateManager rel = RelationStrategies.getStateManager(sm.
fetchObjectField(field.getIndex()), store.getContext());
- updateInverse(sm, rel, store, rm, null);
+ updateInverse(sm, rel, store, rm);
} else
nullInverse(sm, rm);
} else {
@@ -241,6 +241,9 @@
*/
private void nullInverse(OpenJPAStateManager sm, RowManager rm)
throws SQLException {
+ if (field.getUseClassCriteria())
+ return;
+
ForeignKey fk = field.getForeignKey();
ColumnIO io = field.getColumnIO();
if (!io.isAnyUpdatable(fk, true))
@@ -260,11 +263,9 @@
* with the given object.
*/
private void updateInverse(OpenJPAStateManager sm, OpenJPAStateManager rel,
- JDBCStore store, RowManager rm, OpenJPAStateManager sm2)
+ JDBCStore store, RowManager rm)
throws SQLException {
- // nothing to do if inverse is null or about to be deleted
- //### should we throw an exception if the inverse is null?
- if (rel == null || rel.isDeleted())
+ if (rel == null)
return;
ForeignKey fk = field.getForeignKey();
@@ -272,11 +273,17 @@
int action;
if (rel.isNew() && !rel.isFlushed()) {
- if (sm2 == null || !io.isAnyInsertable(fk, false))
+ if (sm.isDeleted() || !io.isAnyInsertable(fk, false))
return;
action = Row.ACTION_INSERT;
+ } else if (rel.isDeleted()) {
+ if (rel.isFlushed() || !sm.isDeleted())
+ return;
+ action = Row.ACTION_DELETE;
} else {
- if (!io.isAnyUpdatable(fk, sm2 == null))
+ if (sm.isDeleted())
+ sm = null;
+ if (!io.isAnyUpdatable(fk, sm == null))
return;
action = Row.ACTION_UPDATE;
}
@@ -306,7 +313,7 @@
row.wherePrimaryKey(rel);
// update the inverse pointer with our oid value
- row.setForeignKey(fk, io, sm2);
+ row.setForeignKey(fk, io, sm);
}
public int supportsSelect(Select sel, int type, OpenJPAStateManager sm,
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java Fri Oct 6 15:31:28 2006
@@ -216,23 +216,32 @@
public void delete(OpenJPAStateManager sm, JDBCStore store, RowManager rm)
throws SQLException {
- if (field.getMappedBy() != null
- || field.getElementMapping().getUseClassCriteria())
+ if (field.getMappedBy() != null)
return;
+ // if nullable, null any existing inverse columns that refer to this obj
ValueMapping elem = field.getElementMapping();
ColumnIO io = elem.getColumnIO();
ForeignKey fk = elem.getForeignKey();
- if (!io.isAnyUpdatable(fk, true))
+ if (!elem.getUseClassCriteria() && io.isAnyUpdatable(fk, true)) {
+ assertInversable();
+ Row row = rm.getAllRows(fk.getTable(), Row.ACTION_UPDATE);
+ row.setForeignKey(fk, io, null);
+ row.whereForeignKey(fk, sm);
+ rm.flushAllRows(row);
return;
+ }
- // if the fk doesn't enforce it, null any existing inverse columns
- // that refer to this obj
- assertInversable();
- Row row = rm.getAllRows(fk.getTable(), Row.ACTION_UPDATE);
- row.setForeignKey(fk, io, null);
- row.whereForeignKey(fk, sm);
- rm.flushAllRows(row);
+ if (!sm.getLoaded().get(field.getIndex()))
+ return;
+
+ // update fk on each field value row
+ ClassMapping rel = field.getElementMapping().getTypeMapping();
+ StoreContext ctx = store.getContext();
+ Collection objs = toCollection(sm.fetchObject(field.getIndex()));
+ if (objs != null && !objs.isEmpty())
+ for (Iterator itr = objs.iterator(); itr.hasNext();)
+ updateInverse (ctx, itr.next(), rel, rm, sm, 0);
}
/**
@@ -244,7 +253,7 @@
throws SQLException {
OpenJPAStateManager invsm = RelationStrategies.getStateManager(inverse,
ctx);
- if (invsm == null || invsm.isDeleted())
+ if (invsm == null)
return;
ValueMapping elem = field.getElementMapping();
@@ -257,12 +266,21 @@
boolean orderWriteable;
if (invsm.isNew() && !invsm.isFlushed()) {
// no need to null inverse columns of new instance
- if (sm == null)
+ if (sm == null || sm.isDeleted())
return;
writeable = io.isAnyInsertable(fk, false);
orderWriteable = _orderInsert;
action = Row.ACTION_INSERT;
+ } else if (invsm.isDeleted()) {
+ // no need to null inverse columns of deleted instance
+ if (invsm.isFlushed() || sm == null || !sm.isDeleted())
+ return;
+ writeable = true;
+ orderWriteable = false;
+ action = Row.ACTION_DELETE;
} else {
+ if (sm != null && sm.isDeleted())
+ sm = null;
writeable = io.isAnyUpdatable(fk, sm == null);
orderWriteable = field.getOrderColumnIO().isUpdatable
(order, sm == null);
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ColumnIO.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ColumnIO.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ColumnIO.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ColumnIO.java Fri Oct 6 15:31:28 2006
@@ -80,7 +80,8 @@
* Return true if any columns for the given key are insertable.
*/
public boolean isAnyInsertable(ForeignKey fk, boolean nullValue) {
- return isAny(fk, _unInsertable, _unNullInsertable, nullValue);
+ return isAny(fk, _unInsertable, _unNullInsertable, nullValue)
+ && (!nullValue || fk.isLogical() || isNullable(fk));
}
/**
@@ -101,7 +102,8 @@
* Return true if all columns for the given key are insertable.
*/
public boolean isAllInsertable(ForeignKey fk, boolean nullValue) {
- return isAll(fk, _unInsertable, _unNullInsertable, nullValue);
+ return isAll(fk, _unInsertable, _unNullInsertable, nullValue)
+ && (!nullValue || fk.isLogical() || isNullable(fk));
}
/**
@@ -152,7 +154,8 @@
* Return true if any columns for the given key are updatable.
*/
public boolean isAnyUpdatable(ForeignKey fk, boolean nullValue) {
- return isAny(fk, _unUpdatable, _unNullUpdatable, nullValue);
+ return isAny(fk, _unUpdatable, _unNullUpdatable, nullValue)
+ && (!nullValue || fk.isLogical() || isNullable(fk));
}
/**
@@ -173,7 +176,8 @@
* Return true if all columns for the given key are updatable.
*/
public boolean isAllUpdatable(ForeignKey fk, boolean nullValue) {
- return isAll(fk, _unUpdatable, _unNullUpdatable, nullValue);
+ return isAll(fk, _unUpdatable, _unNullUpdatable, nullValue)
+ && (!nullValue || fk.isLogical() || isNullable(fk));
}
/**
@@ -283,5 +287,16 @@
if (is)
return property & ~(2 << col);
return property | (2 << col);
+ }
+
+ /**
+ * Whether the given foreign key is nullable.
+ */
+ private boolean isNullable(ForeignKey fk) {
+ Column[] cols = fk.getColumns();
+ for (int i = 0; i < cols.length; i++)
+ if (cols[i].isNotNull() || cols[i].isPrimaryKey())
+ return false;
+ return true;
}
}
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ForeignKey.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ForeignKey.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ForeignKey.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ForeignKey.java Fri Oct 6 15:31:28 2006
@@ -203,7 +203,7 @@
seen.add(this);
for (int i = 0; i < cols.length; i++) {
for (int j = 0; j < fks.length; j++) {
- if (fks[j].getPrimaryKeyColumn(cols[i]) == null)
+ if (!fks[j].containsColumn(cols[i]))
continue;
if (!seen.contains(fks[j])
&& fks[j].isPrimaryKeyAutoAssigned(seen)) {
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java Fri Oct 6 15:31:28 2006
@@ -390,10 +390,11 @@
setter = _pc.getDeclaredMethod(getSetterName(fmds[i]),
new Class[]{ fmds[i].getDeclaredType() });
if (setter == null) {
- if (returned == null)
+ if (returned == null) {
addViolation("property-no-setter",
new Object[]{ fmds[i] }, true);
- else {
+ continue;
+ } else {
// create synthetic setter
setter = _pc.declareMethod(getSetterName(fmds[i]),
void.class, new Class[]{ fmds[i].getDeclaredType() });
@@ -419,10 +420,9 @@
_backingFields.put(setter.getName(), assigned.getName());
if (assigned != returned)
- addViolation("property-setter-getter-mismatch",
- new Object[]{ fmds[i], assigned.getName(),
- (returned == null) ? null : returned.getName() },
- false);
+ addViolation("property-setter-getter-mismatch", new Object[]
+ { fmds[i], assigned.getName(), (returned == null)
+ ? null : returned.getName() }, false);
}
}
}
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java Fri Oct 6 15:31:28 2006
@@ -1928,8 +1928,7 @@
exceps = add(exceps,
newFlushException(_store.flush(transactional)));
}
- }
- finally {
+ } finally {
_flags &= ~FLAG_STORE_FLUSHING;
if (reason == FLUSH_ROLLBACK)
@@ -1942,21 +1941,24 @@
StateManagerImpl sm;
for (Iterator itr = transactional.iterator(); itr.hasNext();) {
sm = (StateManagerImpl) itr.next();
+ try {
+ // the state may have become transient, such as if
+ // it is embedded and the owner has been deleted during
+ // this flush process; bug #1100
+ if (sm.getPCState() == PCState.TRANSIENT)
+ continue;
- // the state may have become transient, such as if
- // it is embedded and the owner has been deleted during
- // this flush process; bug #1100
- if (sm.getPCState() == PCState.TRANSIENT)
- continue;
-
- sm.afterFlush(reason);
- if (reason == FLUSH_INC) {
- // if not about to clear trans cache for commit anyway,
- // re-cache dirty objects with default soft refs; we
- // don't need hard refs now that the changes have been
- // flushed
- sm.proxyFields(true, false);
- _transCache.flushed(sm);
+ sm.afterFlush(reason);
+ if (reason == FLUSH_INC) {
+ // if not about to clear trans cache for commit
+ // anyway, re-cache dirty objects with default soft
+ // refs; we don't need hard refs now that the
+ // changes have been flushed
+ sm.proxyFields(true, false);
+ _transCache.flushed(sm);
+ }
+ } catch (Exception e) {
+ exceps = add(exceps, e);
}
}
}
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachManager.java Fri Oct 6 15:31:28 2006
@@ -194,7 +194,7 @@
* needed. Return true if flushed/stored, false otherwise.
*/
private static boolean flushDirty(StateManagerImpl sm) {
- if (!sm.isDirty())
+ if (!sm.isDirty() || !sm.getBroker().isActive())
return false;
// only flush if there are actually any dirty non-flushed fields
Modified: incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/meta/XMLMetaDataParser.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/meta/XMLMetaDataParser.java?view=diff&rev=453796&r1=453795&r2=453796
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/meta/XMLMetaDataParser.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/meta/XMLMetaDataParser.java Fri Oct 6 15:31:28 2006
@@ -332,7 +332,6 @@
// even if we want to validate, specify that it won't happen
// if we have neither a DocType not a Schema
Object schemaSource = getSchemaSource();
-
if (schemaSource != null && _schemaBug) {
if (_log != null && _log.isInfoEnabled())
_log.info(_loc.get("parser-schema-bug"));