The problem is likely in the mapping. At the minimum you'll need to
check that PK Generation Strategy is set to "Database-Generated" to
all entities in question.
Andrus
On Nov 20, 2008, at 1:10 AM, Michael Shea wrote:
Hi guys -
I am wondering if there is any way to tell cayenne what order to
commit new objects in.
My issue is basically like this:
Suppose I have Category objects and Item objects.
A user can pass in a CategoryDescriptor, which contains a list of
ItemDescriptors. I want cayenne to generate, from these descriptors,
the corresponding database-model objects and rows in the database.
So I do something like this:
public Category createCategory( CategoryDescriptor
categoryDescriptor )
{
Context context = ...; // do something to get the context here.
Category category = context.newObject( Category.class );
.... // fill in stuff about the category object here.
for ( ItemDescriptor itemDescriptor :
categoryDescriptor.getItemDescriptors() )
{
Item item = context.newObject( Item.class );
... // fill in stuff about the item object here.
}
context.commitChanges();
return Category;
}
The problem I am having is that both Category and Item have primary
keys which are autogenerated by database (I am using MySQL, the ID's
are generated via AUTO_INCREMENT columns). It looks like cayenne is
attempting to create the Item objects before creating the Category
object, and then it's giving me a commit exception like this:
org.apache.cayenne.CayenneRuntimeException: [v.3.0M4 May 18 2008
16:32:02] Commit Exception
at
org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:
1192)
at
org.apache.cayenne.access.DataContext.commitChanges(DataContext.java:
1066)
at com.nitido.rss.RSSNugget.createCategory(RSSNugget.java:294)
...
Caused by: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:
Table 'rss.AUTO_PK_SUPPORT' doesn't exist
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1026)
...
It looks like, since the ID on the Item is null and the Category
object hasn't been initialized yet, Cayenne is trying to generate an
ID for the row. I don't see any other INSERT commands from the
logger after I call context.commitChanges(), so the attempt to
insert a row for the Item object looks to be the first thing that
it's trying to do.
So, my questions are:
1. Is this normal? Or does this sound like it could be a problem
caused by me screwing up the mapping.xml?
3. Is it a good idea to work around this by using either
AUTO_PK_SUPPORT or a custom database sequence, and forget about the
AUTO_INCREMENT feature? I have control over the database schema, so
I could do this instead. Alternately, I could just generate my own
ID's without using cayenne, but I'd rather not.
4. Is it normal to do this by committing the Category objects before
attempting to create Item objects related to them? That seems
somewhat hacky to me, though.
BTW, I'm using Cayenne 3.0M4.
Thanks!
Shea.