OPENJPA-1438: fix wherePrimaryKey for entity using derived identity

git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@892430 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Fay Wang 2009-12-19 04:50:24 +00:00
parent 5d9f08e728
commit d189eac9dd
2 changed files with 15 additions and 5 deletions

View File

@ -183,7 +183,8 @@ public class RowImpl
while (mapping.getTable() != getTable())
mapping = mapping.getPCSuperclassMapping();
Column[] cols = mapping.getPrimaryKeyColumns();
flushJoinValues(sm, cols, cols, io, set);
Object oid = mapping.useIdClassFromParent() ? sm.getObjectId() : null;
flushJoinValues(sm, oid, cols, cols, io, set);
}
public void setForeignKey(ForeignKey fk, OpenJPAStateManager sm)
@ -219,7 +220,7 @@ public class RowImpl
private void flushForeignKey(ForeignKey fk, ColumnIO io,
OpenJPAStateManager sm, boolean set)
throws SQLException {
flushJoinValues(sm, fk.getPrimaryKeyColumns(), fk.getColumns(),
flushJoinValues(sm, null, fk.getPrimaryKeyColumns(), fk.getColumns(),
io, set);
if (sm != null) {
Column[] cols = fk.getConstantColumns();
@ -250,7 +251,7 @@ public class RowImpl
* @param set whether this should be flushed as an update or
* as a where condition
*/
private void flushJoinValues(OpenJPAStateManager to, Column[] toCols,
private void flushJoinValues(OpenJPAStateManager to, Object oid, Column[] toCols,
Column[] fromCols, ColumnIO io, boolean set)
throws SQLException {
if (to == null) {
@ -278,8 +279,13 @@ public class RowImpl
}
join = toMapping.assertJoinable(toCols[i]);
val = join.getJoinValue(to, toCols[i], (JDBCStore) to.
getContext().getStoreManager().getInnermostDelegate());
if (oid != null)
val = join.getJoinValue(oid, toCols[i], (JDBCStore) to.
getContext().getStoreManager().getInnermostDelegate());
else
val = join.getJoinValue(to, toCols[i], (JDBCStore) to.
getContext().getStoreManager().getInnermostDelegate());
if (set && val == null) {
if (canSet(io, i, true))
setNull(fromCols[i]);

View File

@ -610,6 +610,10 @@ public class TestMappedById extends SingleEMFTestCase {
MedicalHistory3 m = em.find(MedicalHistory3.class, new PersonId3("f_1", "l_1"));
MedicalHistory3 m0 = medicals3.get("f_1");
assertEquals(m, m0);
em.getTransaction().begin();
em.remove(m);
em.getTransaction().commit();
}
public void queryObj6() {