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

From: Alexander Lamb (dev) ("Alexander)
Date: Sun Jan 21 2007 - 12:49:40 EST

  • Next message: Alexander Lamb (dev): "Re: Creating new object in validateForInsert or validateForSave (are you certain?) (Oups...)"

    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
    >>
    >



    This archive was generated by hypermail 2.0.0 : Sun Jan 21 2007 - 12:51:01 EST