You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cayenne.apache.org by "Alexander Lamb (dev)" <al...@mac.com> on 2007/01/16 22:07:02 UTC

Creating new object in validateForInsert or validateForSave

Hello list,

I am currently using Cayenne 2.0.

I read it was possible to modify objects during a validateForInsert  
or validateForSave call (e.g. not the same as old WebObjects).

What about creating a new object and inserting it in the DataContext?  
Will it get saved at the same time?

My problem is the following:

I have an object which has a to-one relationship to another object.  
That other object has to be created at the same time as the first  
one. I would like to make it automatic so the user of the library I  
am writing can simply create and insert the first object and the  
second one will follow.

To understand why I am creating two objects related one-to-one it is  
because I have an entity which can be related (to-one) to either one  
of four other entities. I am doing this instead of modeling things  
with a class hierarchy since cayenne doesn't support multiple tables  
class hierarchies.

Thanks for any hints!

Alex

Re: Creating new object in validateForInsert or validateForSave (are you certain?) (Oups...)

Posted by Andrus Adamchik <an...@objectstyle.org>.
Yes, since 2.0.2 is synched from Apache, it is already there:

http://mirrors.ibiblio.org/pub/mirrors/maven2/org/apache/cayenne/ 
cayenne-nodeps/2.0.2/

(1.2.2 requires assistance from Maven folks, so it is lagging behind)

Andrus


On Jan 22, 2007, at 11:39 PM, Alexander Lamb (dev) wrote:

> Ok, I was with version 2.0.1-incubating (with Maven). Is 2.0.2  
> already available through Maven?
>
> On Jan 22, 2007, at 12:01 PM, Andrus Adamchik wrote:
>
>> Actually you may want to upgrade to 2.0.2 - you may be affected by  
>> this bug that was fixed in the last release:
>>
>> https://issues.apache.org/cayenne/browse/CAY-712
>>
>> Andrus
>>
>>
>> On Jan 21, 2007, at 11:10 PM, Alexander Lamb (dev) wrote:
>>
>>> Well, it might be me... having trouble with a class hierarchy. So  
>>> first I'll check that, then I'll be back with the  
>>> validateForInsert :-)
>>>
>>> On Jan 21, 2007, at 6:49 PM, Alexander Lamb (dev) wrote:
>>>
>>>> Hello, me again!
>>>>
>>>> Are you certain it is possible to handle fetches and creations  
>>>> in validateForInsert like this for example:
>>>>
>>>> public void validateForInsert(ValidationResult validationResult)
>>>>     {
>>>>     Scope scope = Scope.scopeWithShortNameInContext 
>>>> (this.getShortName(),this.getDataContext());
>>>>     if(scope == null)
>>>>       {
>>>>       RegistryScope registryScope = new RegistryScope();
>>>>       this.getDataContext().registerNewObject(registryScope);
>>>>       registryScope.setShortName(this.getShortName());
>>>>       registryScope.setScopeClass("REGISTRY");
>>>>       registryScope.setName(this.getLongName());
>>>>       registryScope.setRegistry(this);
>>>>       }
>>>>     }
>>>>
>>>> I get a wonderfull index out of bounds deep in the cayenne classes:
>>>>
>>>> java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
>>>>         at java.util.ArrayList.RangeCheck(ArrayList.java:546)
>>>>         at java.util.ArrayList.get(ArrayList.java:321)
>>>>         at java.util.Collections$UnmodifiableList.get 
>>>> (Collections.java:1155)
>>>>         at  
>>>> org.apache.cayenne.access.trans.SelectTranslator.appendQueryColumns 
>>>> (SelectTranslator.java:400)
>>>>         at  
>>>> org.apache.cayenne.access.trans.SelectTranslator.buildResultColumns 
>>>> (SelectTranslator.java:338)
>>>>         at  
>>>> org.apache.cayenne.access.trans.SelectTranslator.createSqlString 
>>>> (SelectTranslator.java:113)
>>>>         at  
>>>> org.apache.cayenne.dba.mysql.MySQLSelectTranslator.createSqlString( 
>>>> MySQLSelectTranslator.java:31)
>>>>         at  
>>>> org.apache.cayenne.access.trans.QueryAssembler.createStatement 
>>>> (QueryAssembler.java:95)
>>>>         at  
>>>> org.apache.cayenne.access.jdbc.SelectAction.performAction 
>>>> (SelectAction.java:71)
>>>>         at org.apache.cayenne.access.DataNodeQueryAction.runQuery 
>>>> (DataNodeQueryAction.java:59)
>>>>         at org.apache.cayenne.access.DataNode.performQueries 
>>>> (DataNode.java:273)
>>>>         at  
>>>> org.apache.cayenne.access.DataDomainQueryAction.runQuery 
>>>> (DataDomainQueryAction.java:319)
>>>>         at org.apache.cayenne.access.DataDomainQueryAction.access 
>>>> $000(DataDomainQueryAction.java:60)
>>>>         at org.apache.cayenne.access.DataDomainQueryAction 
>>>> $1.transform(DataDomainQueryAction.java:291)
>>>>         at org.apache.cayenne.access.DataDomain.runInTransaction 
>>>> (DataDomain.java:820)
>>>>         at  
>>>> org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransacti 
>>>> on(DataDomainQueryAction.java:288)
>>>>         at  
>>>> org.apache.cayenne.access.DataDomainQueryAction.execute 
>>>> (DataDomainQueryAction.java:109)
>>>>         at org.apache.cayenne.access.DataDomain.onQuery 
>>>> (DataDomain.java:730)
>>>>         at  
>>>> org.apache.cayenne.util.ObjectContextQueryAction.runQuery 
>>>> (ObjectContextQueryAction.java:217)
>>>>         at  
>>>> org.apache.cayenne.access.DataContextQueryAction.execute 
>>>> (DataContextQueryAction.java:54)
>>>>         at org.apache.cayenne.access.DataContext.onQuery 
>>>> (DataContext.java:1386)
>>>>         at org.apache.cayenne.access.DataContext.performQuery 
>>>> (DataContext.java:1375)
>>>>         at ch.rodano.role.model.Scope.scopeWithShortNameInContext 
>>>> (Scope.java:18)
>>>>         at ch.rodano.role.model.Registry.validateForInsert 
>>>> (Registry.java:39)
>>>>
>>>>
>>>> On Jan 17, 2007, at 8:53 AM, Andrus Adamchik wrote:
>>>>
>>>>> Hi Alex,
>>>>>
>>>>> Yes you can do that. Validation routine is executed before  
>>>>> object changes are finalized, allowing arbitrary object  
>>>>> operations to be performed during the validation.
>>>>>
>>>>> Andrus
>>>>>
>>>>>
>>>>> On Jan 17, 2007, at 12:07 AM, Alexander Lamb (dev) wrote:
>>>>>
>>>>>> Hello list,
>>>>>>
>>>>>> I am currently using Cayenne 2.0.
>>>>>>
>>>>>> I read it was possible to modify objects during a  
>>>>>> validateForInsert or validateForSave call (e.g. not the same  
>>>>>> as old WebObjects).
>>>>>>
>>>>>> What about creating a new object and inserting it in the  
>>>>>> DataContext? Will it get saved at the same time?
>>>>>>
>>>>>> My problem is the following:
>>>>>>
>>>>>> I have an object which has a to-one relationship to another  
>>>>>> object. That other object has to be created at the same time  
>>>>>> as the first one. I would like to make it automatic so the  
>>>>>> user of the library I am writing can simply create and insert  
>>>>>> the first object and the second one will follow.
>>>>>>
>>>>>> To understand why I am creating two objects related one-to-one  
>>>>>> it is because I have an entity which can be related (to-one)  
>>>>>> to either one of four other entities. I am doing this instead  
>>>>>> of modeling things with a class hierarchy since cayenne  
>>>>>> doesn't support multiple tables class hierarchies.
>>>>>>
>>>>>> Thanks for any hints!
>>>>>>
>>>>>> Alex
>>>>>>
>>>>>
>>>>
>>>
>>>
>>
>
>


Re: Creating new object in validateForInsert or validateForSave (are you certain?) (Oups...)

Posted by "Alexander Lamb (dev)" <al...@mac.com>.
Ok, I was with version 2.0.1-incubating (with Maven). Is 2.0.2  
already available through Maven?

On Jan 22, 2007, at 12:01 PM, Andrus Adamchik wrote:

> Actually you may want to upgrade to 2.0.2 - you may be affected by  
> this bug that was fixed in the last release:
>
> https://issues.apache.org/cayenne/browse/CAY-712
>
> Andrus
>
>
> On Jan 21, 2007, at 11:10 PM, Alexander Lamb (dev) wrote:
>
>> Well, it might be me... having trouble with a class hierarchy. So  
>> first I'll check that, then I'll be back with the  
>> validateForInsert :-)
>>
>> On Jan 21, 2007, at 6:49 PM, Alexander Lamb (dev) wrote:
>>
>>> Hello, me again!
>>>
>>> Are you certain it is possible to handle fetches and creations in  
>>> validateForInsert like this for example:
>>>
>>> public void validateForInsert(ValidationResult validationResult)
>>>     {
>>>     Scope scope = Scope.scopeWithShortNameInContext 
>>> (this.getShortName(),this.getDataContext());
>>>     if(scope == null)
>>>       {
>>>       RegistryScope registryScope = new RegistryScope();
>>>       this.getDataContext().registerNewObject(registryScope);
>>>       registryScope.setShortName(this.getShortName());
>>>       registryScope.setScopeClass("REGISTRY");
>>>       registryScope.setName(this.getLongName());
>>>       registryScope.setRegistry(this);
>>>       }
>>>     }
>>>
>>> I get a wonderfull index out of bounds deep in the cayenne classes:
>>>
>>> java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
>>>         at java.util.ArrayList.RangeCheck(ArrayList.java:546)
>>>         at java.util.ArrayList.get(ArrayList.java:321)
>>>         at java.util.Collections$UnmodifiableList.get 
>>> (Collections.java:1155)
>>>         at  
>>> org.apache.cayenne.access.trans.SelectTranslator.appendQueryColumns( 
>>> SelectTranslator.java:400)
>>>         at  
>>> org.apache.cayenne.access.trans.SelectTranslator.buildResultColumns( 
>>> SelectTranslator.java:338)
>>>         at  
>>> org.apache.cayenne.access.trans.SelectTranslator.createSqlString 
>>> (SelectTranslator.java:113)
>>>         at  
>>> org.apache.cayenne.dba.mysql.MySQLSelectTranslator.createSqlString 
>>> (MySQLSelectTranslator.java:31)
>>>         at  
>>> org.apache.cayenne.access.trans.QueryAssembler.createStatement 
>>> (QueryAssembler.java:95)
>>>         at  
>>> org.apache.cayenne.access.jdbc.SelectAction.performAction 
>>> (SelectAction.java:71)
>>>         at org.apache.cayenne.access.DataNodeQueryAction.runQuery 
>>> (DataNodeQueryAction.java:59)
>>>         at org.apache.cayenne.access.DataNode.performQueries 
>>> (DataNode.java:273)
>>>         at  
>>> org.apache.cayenne.access.DataDomainQueryAction.runQuery 
>>> (DataDomainQueryAction.java:319)
>>>         at org.apache.cayenne.access.DataDomainQueryAction.access 
>>> $000(DataDomainQueryAction.java:60)
>>>         at org.apache.cayenne.access.DataDomainQueryAction 
>>> $1.transform(DataDomainQueryAction.java:291)
>>>         at org.apache.cayenne.access.DataDomain.runInTransaction 
>>> (DataDomain.java:820)
>>>         at  
>>> org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransactio 
>>> n(DataDomainQueryAction.java:288)
>>>         at org.apache.cayenne.access.DataDomainQueryAction.execute 
>>> (DataDomainQueryAction.java:109)
>>>         at org.apache.cayenne.access.DataDomain.onQuery 
>>> (DataDomain.java:730)
>>>         at  
>>> org.apache.cayenne.util.ObjectContextQueryAction.runQuery 
>>> (ObjectContextQueryAction.java:217)
>>>         at  
>>> org.apache.cayenne.access.DataContextQueryAction.execute 
>>> (DataContextQueryAction.java:54)
>>>         at org.apache.cayenne.access.DataContext.onQuery 
>>> (DataContext.java:1386)
>>>         at org.apache.cayenne.access.DataContext.performQuery 
>>> (DataContext.java:1375)
>>>         at ch.rodano.role.model.Scope.scopeWithShortNameInContext 
>>> (Scope.java:18)
>>>         at ch.rodano.role.model.Registry.validateForInsert 
>>> (Registry.java:39)
>>>
>>>
>>> On Jan 17, 2007, at 8:53 AM, Andrus Adamchik wrote:
>>>
>>>> Hi Alex,
>>>>
>>>> Yes you can do that. Validation routine is executed before  
>>>> object changes are finalized, allowing arbitrary object  
>>>> operations to be performed during the validation.
>>>>
>>>> Andrus
>>>>
>>>>
>>>> On Jan 17, 2007, at 12:07 AM, Alexander Lamb (dev) wrote:
>>>>
>>>>> Hello list,
>>>>>
>>>>> I am currently using Cayenne 2.0.
>>>>>
>>>>> I read it was possible to modify objects during a  
>>>>> validateForInsert or validateForSave call (e.g. not the same as  
>>>>> old WebObjects).
>>>>>
>>>>> What about creating a new object and inserting it in the  
>>>>> DataContext? Will it get saved at the same time?
>>>>>
>>>>> My problem is the following:
>>>>>
>>>>> I have an object which has a to-one relationship to another  
>>>>> object. That other object has to be created at the same time as  
>>>>> the first one. I would like to make it automatic so the user of  
>>>>> the library I am writing can simply create and insert the first  
>>>>> object and the second one will follow.
>>>>>
>>>>> To understand why I am creating two objects related one-to-one  
>>>>> it is because I have an entity which can be related (to-one) to  
>>>>> either one of four other entities. I am doing this instead of  
>>>>> modeling things with a class hierarchy since cayenne doesn't  
>>>>> support multiple tables class hierarchies.
>>>>>
>>>>> Thanks for any hints!
>>>>>
>>>>> Alex
>>>>>
>>>>
>>>
>>
>>
>


Re: Creating new object in validateForInsert or validateForSave (are you certain?) (Oups...)

Posted by Andrus Adamchik <an...@objectstyle.org>.
Actually you may want to upgrade to 2.0.2 - you may be affected by  
this bug that was fixed in the last release:

https://issues.apache.org/cayenne/browse/CAY-712

Andrus


On Jan 21, 2007, at 11:10 PM, Alexander Lamb (dev) wrote:

> Well, it might be me... having trouble with a class hierarchy. So  
> first I'll check that, then I'll be back with the  
> validateForInsert :-)
>
> On Jan 21, 2007, at 6:49 PM, Alexander Lamb (dev) wrote:
>
>> Hello, me again!
>>
>> Are you certain it is possible to handle fetches and creations in  
>> validateForInsert like this for example:
>>
>> public void validateForInsert(ValidationResult validationResult)
>>     {
>>     Scope scope = Scope.scopeWithShortNameInContext 
>> (this.getShortName(),this.getDataContext());
>>     if(scope == null)
>>       {
>>       RegistryScope registryScope = new RegistryScope();
>>       this.getDataContext().registerNewObject(registryScope);
>>       registryScope.setShortName(this.getShortName());
>>       registryScope.setScopeClass("REGISTRY");
>>       registryScope.setName(this.getLongName());
>>       registryScope.setRegistry(this);
>>       }
>>     }
>>
>> I get a wonderfull index out of bounds deep in the cayenne classes:
>>
>> java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
>>         at java.util.ArrayList.RangeCheck(ArrayList.java:546)
>>         at java.util.ArrayList.get(ArrayList.java:321)
>>         at java.util.Collections$UnmodifiableList.get 
>> (Collections.java:1155)
>>         at  
>> org.apache.cayenne.access.trans.SelectTranslator.appendQueryColumns 
>> (SelectTranslator.java:400)
>>         at  
>> org.apache.cayenne.access.trans.SelectTranslator.buildResultColumns 
>> (SelectTranslator.java:338)
>>         at  
>> org.apache.cayenne.access.trans.SelectTranslator.createSqlString 
>> (SelectTranslator.java:113)
>>         at  
>> org.apache.cayenne.dba.mysql.MySQLSelectTranslator.createSqlString 
>> (MySQLSelectTranslator.java:31)
>>         at  
>> org.apache.cayenne.access.trans.QueryAssembler.createStatement 
>> (QueryAssembler.java:95)
>>         at  
>> org.apache.cayenne.access.jdbc.SelectAction.performAction 
>> (SelectAction.java:71)
>>         at org.apache.cayenne.access.DataNodeQueryAction.runQuery 
>> (DataNodeQueryAction.java:59)
>>         at org.apache.cayenne.access.DataNode.performQueries 
>> (DataNode.java:273)
>>         at org.apache.cayenne.access.DataDomainQueryAction.runQuery 
>> (DataDomainQueryAction.java:319)
>>         at org.apache.cayenne.access.DataDomainQueryAction.access 
>> $000(DataDomainQueryAction.java:60)
>>         at org.apache.cayenne.access.DataDomainQueryAction 
>> $1.transform(DataDomainQueryAction.java:291)
>>         at org.apache.cayenne.access.DataDomain.runInTransaction 
>> (DataDomain.java:820)
>>         at  
>> org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction 
>> (DataDomainQueryAction.java:288)
>>         at org.apache.cayenne.access.DataDomainQueryAction.execute 
>> (DataDomainQueryAction.java:109)
>>         at org.apache.cayenne.access.DataDomain.onQuery 
>> (DataDomain.java:730)
>>         at  
>> org.apache.cayenne.util.ObjectContextQueryAction.runQuery 
>> (ObjectContextQueryAction.java:217)
>>         at org.apache.cayenne.access.DataContextQueryAction.execute 
>> (DataContextQueryAction.java:54)
>>         at org.apache.cayenne.access.DataContext.onQuery 
>> (DataContext.java:1386)
>>         at org.apache.cayenne.access.DataContext.performQuery 
>> (DataContext.java:1375)
>>         at ch.rodano.role.model.Scope.scopeWithShortNameInContext 
>> (Scope.java:18)
>>         at ch.rodano.role.model.Registry.validateForInsert 
>> (Registry.java:39)
>>
>>
>> On Jan 17, 2007, at 8:53 AM, Andrus Adamchik wrote:
>>
>>> Hi Alex,
>>>
>>> Yes you can do that. Validation routine is executed before object  
>>> changes are finalized, allowing arbitrary object operations to be  
>>> performed during the validation.
>>>
>>> Andrus
>>>
>>>
>>> On Jan 17, 2007, at 12:07 AM, Alexander Lamb (dev) wrote:
>>>
>>>> Hello list,
>>>>
>>>> I am currently using Cayenne 2.0.
>>>>
>>>> I read it was possible to modify objects during a  
>>>> validateForInsert or validateForSave call (e.g. not the same as  
>>>> old WebObjects).
>>>>
>>>> What about creating a new object and inserting it in the  
>>>> DataContext? Will it get saved at the same time?
>>>>
>>>> My problem is the following:
>>>>
>>>> I have an object which has a to-one relationship to another  
>>>> object. That other object has to be created at the same time as  
>>>> the first one. I would like to make it automatic so the user of  
>>>> the library I am writing can simply create and insert the first  
>>>> object and the second one will follow.
>>>>
>>>> To understand why I am creating two objects related one-to-one  
>>>> it is because I have an entity which can be related (to-one) to  
>>>> either one of four other entities. I am doing this instead of  
>>>> modeling things with a class hierarchy since cayenne doesn't  
>>>> support multiple tables class hierarchies.
>>>>
>>>> Thanks for any hints!
>>>>
>>>> Alex
>>>>
>>>
>>
>
>


Re: Creating new object in validateForInsert or validateForSave (are you certain?) (Oups...)

Posted by "Alexander Lamb (dev)" <al...@mac.com>.
Well, it might be me... having trouble with a class hierarchy. So  
first I'll check that, then I'll be back with the validateForInsert :-)

On Jan 21, 2007, at 6:49 PM, Alexander Lamb (dev) wrote:

> Hello, me again!
>
> Are you certain it is possible to handle fetches and creations in  
> validateForInsert like this for example:
>
> public void validateForInsert(ValidationResult validationResult)
>     {
>     Scope scope = Scope.scopeWithShortNameInContext 
> (this.getShortName(),this.getDataContext());
>     if(scope == null)
>       {
>       RegistryScope registryScope = new RegistryScope();
>       this.getDataContext().registerNewObject(registryScope);
>       registryScope.setShortName(this.getShortName());
>       registryScope.setScopeClass("REGISTRY");
>       registryScope.setName(this.getLongName());
>       registryScope.setRegistry(this);
>       }
>     }
>
> I get a wonderfull index out of bounds deep in the cayenne classes:
>
> java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
>         at java.util.ArrayList.RangeCheck(ArrayList.java:546)
>         at java.util.ArrayList.get(ArrayList.java:321)
>         at java.util.Collections$UnmodifiableList.get 
> (Collections.java:1155)
>         at  
> org.apache.cayenne.access.trans.SelectTranslator.appendQueryColumns 
> (SelectTranslator.java:400)
>         at  
> org.apache.cayenne.access.trans.SelectTranslator.buildResultColumns 
> (SelectTranslator.java:338)
>         at  
> org.apache.cayenne.access.trans.SelectTranslator.createSqlString 
> (SelectTranslator.java:113)
>         at  
> org.apache.cayenne.dba.mysql.MySQLSelectTranslator.createSqlString 
> (MySQLSelectTranslator.java:31)
>         at  
> org.apache.cayenne.access.trans.QueryAssembler.createStatement 
> (QueryAssembler.java:95)
>         at org.apache.cayenne.access.jdbc.SelectAction.performAction 
> (SelectAction.java:71)
>         at org.apache.cayenne.access.DataNodeQueryAction.runQuery 
> (DataNodeQueryAction.java:59)
>         at org.apache.cayenne.access.DataNode.performQueries 
> (DataNode.java:273)
>         at org.apache.cayenne.access.DataDomainQueryAction.runQuery 
> (DataDomainQueryAction.java:319)
>         at org.apache.cayenne.access.DataDomainQueryAction.access 
> $000(DataDomainQueryAction.java:60)
>         at org.apache.cayenne.access.DataDomainQueryAction 
> $1.transform(DataDomainQueryAction.java:291)
>         at org.apache.cayenne.access.DataDomain.runInTransaction 
> (DataDomain.java:820)
>         at  
> org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction( 
> DataDomainQueryAction.java:288)
>         at org.apache.cayenne.access.DataDomainQueryAction.execute 
> (DataDomainQueryAction.java:109)
>         at org.apache.cayenne.access.DataDomain.onQuery 
> (DataDomain.java:730)
>         at org.apache.cayenne.util.ObjectContextQueryAction.runQuery 
> (ObjectContextQueryAction.java:217)
>         at org.apache.cayenne.access.DataContextQueryAction.execute 
> (DataContextQueryAction.java:54)
>         at org.apache.cayenne.access.DataContext.onQuery 
> (DataContext.java:1386)
>         at org.apache.cayenne.access.DataContext.performQuery 
> (DataContext.java:1375)
>         at ch.rodano.role.model.Scope.scopeWithShortNameInContext 
> (Scope.java:18)
>         at ch.rodano.role.model.Registry.validateForInsert 
> (Registry.java:39)
>
>
> On Jan 17, 2007, at 8:53 AM, Andrus Adamchik wrote:
>
>> Hi Alex,
>>
>> Yes you can do that. Validation routine is executed before object  
>> changes are finalized, allowing arbitrary object operations to be  
>> performed during the validation.
>>
>> Andrus
>>
>>
>> On Jan 17, 2007, at 12:07 AM, Alexander Lamb (dev) wrote:
>>
>>> Hello list,
>>>
>>> I am currently using Cayenne 2.0.
>>>
>>> I read it was possible to modify objects during a  
>>> validateForInsert or validateForSave call (e.g. not the same as  
>>> old WebObjects).
>>>
>>> What about creating a new object and inserting it in the  
>>> DataContext? Will it get saved at the same time?
>>>
>>> My problem is the following:
>>>
>>> I have an object which has a to-one relationship to another  
>>> object. That other object has to be created at the same time as  
>>> the first one. I would like to make it automatic so the user of  
>>> the library I am writing can simply create and insert the first  
>>> object and the second one will follow.
>>>
>>> To understand why I am creating two objects related one-to-one it  
>>> is because I have an entity which can be related (to-one) to  
>>> either one of four other entities. I am doing this instead of  
>>> modeling things with a class hierarchy since cayenne doesn't  
>>> support multiple tables class hierarchies.
>>>
>>> Thanks for any hints!
>>>
>>> Alex
>>>
>>
>


Re: Creating new object in validateForInsert or validateForSave (are you certain?)

Posted by "Alexander Lamb (dev)" <al...@mac.com>.
Hello, me again!

Are you certain it is possible to handle fetches and creations in  
validateForInsert like this for example:

public void validateForInsert(ValidationResult validationResult)
     {
     Scope scope = Scope.scopeWithShortNameInContext(this.getShortName 
(),this.getDataContext());
     if(scope == null)
       {
       RegistryScope registryScope = new RegistryScope();
       this.getDataContext().registerNewObject(registryScope);
       registryScope.setShortName(this.getShortName());
       registryScope.setScopeClass("REGISTRY");
       registryScope.setName(this.getLongName());
       registryScope.setRegistry(this);
       }
     }

I get a wonderfull index out of bounds deep in the cayenne classes:

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
         at java.util.ArrayList.RangeCheck(ArrayList.java:546)
         at java.util.ArrayList.get(ArrayList.java:321)
         at java.util.Collections$UnmodifiableList.get 
(Collections.java:1155)
         at  
org.apache.cayenne.access.trans.SelectTranslator.appendQueryColumns 
(SelectTranslator.java:400)
         at  
org.apache.cayenne.access.trans.SelectTranslator.buildResultColumns 
(SelectTranslator.java:338)
         at  
org.apache.cayenne.access.trans.SelectTranslator.createSqlString 
(SelectTranslator.java:113)
         at  
org.apache.cayenne.dba.mysql.MySQLSelectTranslator.createSqlString 
(MySQLSelectTranslator.java:31)
         at  
org.apache.cayenne.access.trans.QueryAssembler.createStatement 
(QueryAssembler.java:95)
         at org.apache.cayenne.access.jdbc.SelectAction.performAction 
(SelectAction.java:71)
         at org.apache.cayenne.access.DataNodeQueryAction.runQuery 
(DataNodeQueryAction.java:59)
         at org.apache.cayenne.access.DataNode.performQueries 
(DataNode.java:273)
         at org.apache.cayenne.access.DataDomainQueryAction.runQuery 
(DataDomainQueryAction.java:319)
         at org.apache.cayenne.access.DataDomainQueryAction.access$000 
(DataDomainQueryAction.java:60)
         at org.apache.cayenne.access.DataDomainQueryAction 
$1.transform(DataDomainQueryAction.java:291)
         at org.apache.cayenne.access.DataDomain.runInTransaction 
(DataDomain.java:820)
         at  
org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction 
(DataDomainQueryAction.java:288)
         at org.apache.cayenne.access.DataDomainQueryAction.execute 
(DataDomainQueryAction.java:109)
         at org.apache.cayenne.access.DataDomain.onQuery 
(DataDomain.java:730)
         at org.apache.cayenne.util.ObjectContextQueryAction.runQuery 
(ObjectContextQueryAction.java:217)
         at org.apache.cayenne.access.DataContextQueryAction.execute 
(DataContextQueryAction.java:54)
         at org.apache.cayenne.access.DataContext.onQuery 
(DataContext.java:1386)
         at org.apache.cayenne.access.DataContext.performQuery 
(DataContext.java:1375)
         at ch.rodano.role.model.Scope.scopeWithShortNameInContext 
(Scope.java:18)
         at ch.rodano.role.model.Registry.validateForInsert 
(Registry.java:39)


On Jan 17, 2007, at 8:53 AM, Andrus Adamchik wrote:

> Hi Alex,
>
> Yes you can do that. Validation routine is executed before object  
> changes are finalized, allowing arbitrary object operations to be  
> performed during the validation.
>
> Andrus
>
>
> On Jan 17, 2007, at 12:07 AM, Alexander Lamb (dev) wrote:
>
>> Hello list,
>>
>> I am currently using Cayenne 2.0.
>>
>> I read it was possible to modify objects during a  
>> validateForInsert or validateForSave call (e.g. not the same as  
>> old WebObjects).
>>
>> What about creating a new object and inserting it in the  
>> DataContext? Will it get saved at the same time?
>>
>> My problem is the following:
>>
>> I have an object which has a to-one relationship to another  
>> object. That other object has to be created at the same time as  
>> the first one. I would like to make it automatic so the user of  
>> the library I am writing can simply create and insert the first  
>> object and the second one will follow.
>>
>> To understand why I am creating two objects related one-to-one it  
>> is because I have an entity which can be related (to-one) to  
>> either one of four other entities. I am doing this instead of  
>> modeling things with a class hierarchy since cayenne doesn't  
>> support multiple tables class hierarchies.
>>
>> Thanks for any hints!
>>
>> Alex
>>
>


Re: Creating new object in validateForInsert or validateForSave

Posted by Andrus Adamchik <an...@objectstyle.org>.
On Jan 17, 2007, at 12:50 PM, Alexander Lamb (dev) wrote:

> I didn't see any "awakeFromInsert" or "awakeFromFetch" on  
> DataObject as it was the case in EOF

As an FYI, Cayenne 3.0 will have a bunch of callbacks that will  
provide similar functionality:

http://cwiki.apache.org/CAYDOC/lifecycle-callbacks.html

(in fact I am using this stuff in production already)

Andrus

Re: Creating new object in validateForInsert or validateForSave

Posted by "Alexander Lamb (dev)" <al...@mac.com>.
Thanks, that's a good news since I didn't see any "awakeFromInsert"  
or "awakeFromFetch" on DataObject as it was the case in EOF (where I  
would have done that kind of work).

Alex

On Jan 17, 2007, at 8:53 AM, Andrus Adamchik wrote:

> Hi Alex,
>
> Yes you can do that. Validation routine is executed before object  
> changes are finalized, allowing arbitrary object operations to be  
> performed during the validation.
>
> Andrus
>
>
> On Jan 17, 2007, at 12:07 AM, Alexander Lamb (dev) wrote:
>
>> Hello list,
>>
>> I am currently using Cayenne 2.0.
>>
>> I read it was possible to modify objects during a  
>> validateForInsert or validateForSave call (e.g. not the same as  
>> old WebObjects).
>>
>> What about creating a new object and inserting it in the  
>> DataContext? Will it get saved at the same time?
>>
>> My problem is the following:
>>
>> I have an object which has a to-one relationship to another  
>> object. That other object has to be created at the same time as  
>> the first one. I would like to make it automatic so the user of  
>> the library I am writing can simply create and insert the first  
>> object and the second one will follow.
>>
>> To understand why I am creating two objects related one-to-one it  
>> is because I have an entity which can be related (to-one) to  
>> either one of four other entities. I am doing this instead of  
>> modeling things with a class hierarchy since cayenne doesn't  
>> support multiple tables class hierarchies.
>>
>> Thanks for any hints!
>>
>> Alex
>>
>


Re: Creating new object in validateForInsert or validateForSave

Posted by Andrus Adamchik <an...@objectstyle.org>.
Hi Alex,

Yes you can do that. Validation routine is executed before object  
changes are finalized, allowing arbitrary object operations to be  
performed during the validation.

Andrus


On Jan 17, 2007, at 12:07 AM, Alexander Lamb (dev) wrote:

> Hello list,
>
> I am currently using Cayenne 2.0.
>
> I read it was possible to modify objects during a validateForInsert  
> or validateForSave call (e.g. not the same as old WebObjects).
>
> What about creating a new object and inserting it in the  
> DataContext? Will it get saved at the same time?
>
> My problem is the following:
>
> I have an object which has a to-one relationship to another object.  
> That other object has to be created at the same time as the first  
> one. I would like to make it automatic so the user of the library I  
> am writing can simply create and insert the first object and the  
> second one will follow.
>
> To understand why I am creating two objects related one-to-one it  
> is because I have an entity which can be related (to-one) to either  
> one of four other entities. I am doing this instead of modeling  
> things with a class hierarchy since cayenne doesn't support  
> multiple tables class hierarchies.
>
> Thanks for any hints!
>
> Alex
>