Bryan,
nothing comes to mind right away. Could you possibly create a Jira
issue with a DataMap that contains the entities involved - I'll run
it in debugger and see what's going on.
Andrus
On Apr 17, 2006, at 10:04 PM, Bryan Lewis wrote:
I'm getting a Commit Exception that I can't figure out. It happens in
commitChanges() with a single new object. When I log the inserted
object
I get the expected:
{<ObjectId:BRADTask, TEMP:000001F6214E0102>; new
[...
creationDate=>2006-04-17 13:46:32.375
author=>{<ObjectId:BRADUserInfo, USERNAME=blewis>}
application=>{<ObjectId:BRADApplication, OID=185>}]}
Note that the last line shows a non-null "application" relationship.
However, the key for it is missing in the SQL:
[QueryLogger] INSERT INTO BRADTask (APPLICATION_ID, AUTHOR_ID,
CREATIONDATE, ... )
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
[QueryLogger] [batch bind: NULL, NULL, '2006-04-17
10:27:08.687', ... ]
[QueryLogger] *** error.java.sql.SQLException: ORA-01400: cannot
insert
NULL into ("...."BRADTASK"."APPLICATION_ID")
I see nothing unusual about the definition of the relationship in the
modeler.
<db-entity name="BRADTASK">
<db-attribute name="APPLICATION_ID" type="INTEGER"
isMandatory="true"/>
...
<db-relationship name="application" source="BRADTASK"
target="BRADAPPLICATION" toMany="false">
<db-attribute-pair source="APPLICATION_ID" target="OID"/>
</db-relationship>
This didn't occur on version 1.2M10; it began with B1 and continues
with
B2. I've reproduced it on Oracle 8 and PostgreSQL, in case it was
another Oracle-only weirdness but it isn't.
Stack trace with 1.2B2 on Postgres:
org.postgresql.util.PSQLException: ERROR: null value in column
"application_id" violates not-null constraint
at
org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse
(QueryExecutorImpl.java:1501)
at
org.postgresql.core.v3.QueryExecutorImpl.processResults
(QueryExecutorImpl.java:1286)
at
org.postgresql.core.v3.QueryExecutorImpl.execute
(QueryExecutorImpl.java:336)
at
org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch
(AbstractJdbc2Statement.java:2540)
at
org.objectstyle.cayenne.access.jdbc.BatchAction.runAsBatch
(BatchAction.java:164)
at
org.objectstyle.cayenne.access.jdbc.BatchAction.performAction
(BatchAction.java:114)
at
org.objectstyle.cayenne.access.DataNodeQueryAction.runQuery
(DataNodeQueryAction.java:95)
at
org.objectstyle.cayenne.access.DataNode.performQueries
(DataNode.java:309)
at
org.objectstyle.cayenne.access.DataDomainFlushAction.runQueries
(DataDomainFlushAction.java:255)
at
org.objectstyle.cayenne.access.DataDomainFlushAction.flush
(DataDomainFlushAction.java:177)
at
org.objectstyle.cayenne.access.DataDomain.onSyncFlush
(DataDomain.java:827)
at
org.objectstyle.cayenne.access.DataDomain$2.transform
(DataDomain.java:798)
at
org.objectstyle.cayenne.access.DataDomain.runInTransaction
(DataDomain.java:853)
at org.objectstyle.cayenne.access.DataDomain.onSync
(DataDomain.java:795)
at
org.objectstyle.cayenne.access.DataContext.flushToParent
(DataContext.java:1217)
at
org.objectstyle.cayenne.access.DataContext.commitChanges
(DataContext.java:1121)
On Oracle the trace is the same, until it gets down to the jdbc level,
of course.