cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrus Adamchik <and...@objectstyle.org>
Subject Re: Order of commits?
Date Fri, 21 Nov 2008 11:50:00 GMT
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.
>


Mime
View raw message