Skip to content

Commit 0e26d70

Browse files
committed
Cater for owner being embedded, so navigate to real owner. For #138
1 parent 0f9bbb4 commit 0e26d70

File tree

4 files changed

+43
-7
lines changed

4 files changed

+43
-7
lines changed

src/main/java/org/datanucleus/store/rdbms/scostore/BackingStoreHelper.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public static int populateOwnerInStatement(ObjectProvider op, ExecutionContext e
6363
boolean embedded = false;
6464
if (op.isEmbedded() && ownerMappingTable instanceof JoinTable && ((JoinTable)ownerMappingTable).getOwnerTable() != null)
6565
{
66-
// Embedded object with this join table, so get the owner object (which will be used in the ownerMapping)
66+
// Embedded object with this join table, so get the owner object (which will be used in the ownerMapping) TODO Cater for nested embedded?
6767
ObjectProvider[] ownerOPs = ec.getOwnersForEmbeddedObjectProvider(op);
6868
if (ownerOPs != null && ownerOPs.length == 1)
6969
{

src/main/java/org/datanucleus/store/rdbms/scostore/FKArrayStore.java

+14-2
Original file line numberDiff line numberDiff line change
@@ -626,12 +626,24 @@ public Iterator<E> iterator(ObjectProvider ownerOP)
626626
SQLController sqlControl = storeMgr.getSQLController();
627627
try
628628
{
629-
// Create the statement and set the owner
629+
// Create the statement
630630
PreparedStatement ps = sqlControl.getStatementForQuery(mconn, stmt);
631+
632+
// Set the owner
633+
ObjectProvider stmtOwnerOP = ownerOP;
634+
if (ownerOP.isEmbedded())
635+
{
636+
// Embedded object with this join table, so get the owner object (which will be used in the ownerMapping)
637+
ObjectProvider[] ownerOPs = ec.getOwnersForEmbeddedObjectProvider(ownerOP);
638+
if (ownerOPs != null && ownerOPs.length == 1)
639+
{
640+
stmtOwnerOP = ownerOPs[0];
641+
}
642+
}
631643
int numParams = ownerIdx.getNumberOfParameterOccurrences();
632644
for (int paramInstance=0;paramInstance<numParams;paramInstance++)
633645
{
634-
ownerIdx.getMapping().setObject(ec, ps, ownerIdx.getParameterPositionsForOccurrence(paramInstance), ownerOP.getObject());
646+
ownerIdx.getMapping().setObject(ec, ps, ownerIdx.getParameterPositionsForOccurrence(paramInstance), stmtOwnerOP.getObject());
635647
}
636648

637649
try

src/main/java/org/datanucleus/store/rdbms/scostore/FKListStore.java

+14-2
Original file line numberDiff line numberDiff line change
@@ -1092,12 +1092,24 @@ protected ListIterator<E> listIterator(ObjectProvider op, int startIdx, int endI
10921092
SQLController sqlControl = storeMgr.getSQLController();
10931093
try
10941094
{
1095-
// Create the statement and set the owner
1095+
// Create the statement
10961096
PreparedStatement ps = sqlControl.getStatementForQuery(mconn, stmt);
1097+
1098+
// Set the owner
1099+
ObjectProvider stmtOwnerOP = op;
1100+
if (op.isEmbedded())
1101+
{
1102+
// Embedded object with this join table, so get the owner object (which will be used in the ownerMapping)
1103+
ObjectProvider[] ownerOPs = ec.getOwnersForEmbeddedObjectProvider(op);
1104+
if (ownerOPs != null && ownerOPs.length == 1)
1105+
{
1106+
stmtOwnerOP = ownerOPs[0];
1107+
}
1108+
}
10971109
int numParams = ownerIdx.getNumberOfParameterOccurrences();
10981110
for (int paramInstance=0;paramInstance<numParams;paramInstance++)
10991111
{
1100-
ownerIdx.getMapping().setObject(ec, ps, ownerIdx.getParameterPositionsForOccurrence(paramInstance), op.getObject());
1112+
ownerIdx.getMapping().setObject(ec, ps, ownerIdx.getParameterPositionsForOccurrence(paramInstance), stmtOwnerOP.getObject());
11011113
}
11021114

11031115
try

src/main/java/org/datanucleus/store/rdbms/scostore/FKSetStore.java

+14-2
Original file line numberDiff line numberDiff line change
@@ -1135,12 +1135,24 @@ public Iterator<E> iterator(ObjectProvider op)
11351135
SQLController sqlControl = storeMgr.getSQLController();
11361136
try
11371137
{
1138-
// Create the statement and set the owner
1138+
// Create the statement
11391139
PreparedStatement ps = sqlControl.getStatementForQuery(mconn, stmt);
1140+
1141+
// Set the owner
1142+
ObjectProvider stmtOwnerOP = op;
1143+
if (op.isEmbedded())
1144+
{
1145+
// Embedded object with this join table, so get the owner object (which will be used in the ownerMapping)
1146+
ObjectProvider[] ownerOPs = ec.getOwnersForEmbeddedObjectProvider(op);
1147+
if (ownerOPs != null && ownerOPs.length == 1)
1148+
{
1149+
stmtOwnerOP = ownerOPs[0];
1150+
}
1151+
}
11401152
int numParams = ownerStmtMapIdx.getNumberOfParameterOccurrences();
11411153
for (int paramInstance=0;paramInstance<numParams;paramInstance++)
11421154
{
1143-
ownerStmtMapIdx.getMapping().setObject(ec, ps, ownerStmtMapIdx.getParameterPositionsForOccurrence(paramInstance), op.getObject());
1155+
ownerStmtMapIdx.getMapping().setObject(ec, ps, ownerStmtMapIdx.getParameterPositionsForOccurrence(paramInstance), stmtOwnerOP.getObject());
11441156
}
11451157

11461158
try

0 commit comments

Comments
 (0)