ROP, flattened relationships and no-reverse relationship and/or dotemplates

From: Marcin Skladaniec (marci..sh.com.au)
Date: Wed Aug 15 2007 - 01:53:25 EDT

  • Next message: Jan Lendholt: "Re: Temporary objects"

    Hello
    I think recently the requirement every relationship to be defined
    both ways was revoked.
    I found few problems with it:

    we have defined (to many, read only):
    <obj-relationship name="sessions" source="Course" target="Session"
    deleteRule="Nullify" db-relationship-path="CourseClasses.sessions"/>

    it looks like cayenne creates fake relationship called
    runtimeRelationship0 which fails during runtime :

         [java] 14:36:38,192 [btpool0-1 ] INFO
    org.apache.cayenne.remote.service.BaseRemoteService :157 - error
    processing message
          [java] java.lang.NoSuchFieldException: runtimeRelationship0
          [java] at java.lang.Class.getDeclaredField(Class.java:1854)
          [java] at
    org.apache.cayenne.reflect.FieldAccessor.lookupFieldInHierarchy
    (FieldAccessor.java:154)
          [java] at
    org.apache.cayenne.reflect.FieldAccessor.lookupFieldInHierarchy
    (FieldAccessor.java:163)
          [java] at
    org.apache.cayenne.reflect.FieldAccessor.lookupFieldInHierarchy
    (FieldAccessor.java:163)
          [java] at
    org.apache.cayenne.reflect.FieldAccessor.prepareField
    (FieldAccessor.java:101)
          [java] at org.apache.cayenne.reflect.FieldAccessor.<init>
    (FieldAccessor.java:50)
          [java] at
    org.apache.cayenne.reflect.PersistentDescriptorFactory.createAccessor
    (PersistentDescriptorFactory.java:191)
          [java] at
    org.apache.cayenne.reflect.valueholder.ValueHolderDescriptorFactory.crea
    teToOneProperty(ValueHolderDescriptorFactory.java:70)
          [java] at
    org.apache.cayenne.reflect.PersistentDescriptorFactory.getDescriptor
    (PersistentDescriptorFactory.java:99)
          [java] at
    org.apache.cayenne.reflect.PersistentDescriptorFactory.getDescriptor
    (PersistentDescriptorFactory.java:51)
          [java] at
    org.apache.cayenne.reflect.ClassDescriptorMap.createDescriptor
    (ClassDescriptorMap.java:122)

    as a workaround a reverse relationship can be created (to one, read
    only) :
    <obj-relationship name="course" source="Session" target="Course" db-
    relationship-path="courseClass.course"/>

    It does work ok than, with a small problem. We have also customised
    the dotemplates (templates to generate the cayenne classes).
    within them we are using loop to create a generic setValueForKey(key,
    value) method for classes on client (this is an equivalent of
    writeProperty(key, value) on server):

    #foreach( $rel in ${objEntity.DeclaredRelationships})
    #if (!$rel.ToMany)
                if (${stringUtils.capitalizedAsConstant($rel.Name)}
    _PROPERTY.equals(key)) { set${stringUtils.capitalized($rel.Name)}( ($
    {importUtils.formatJavaType($rel.TargetEntity.ClientClassName)})
    value); return; }
    #end
    #end

    but we don't want to iterate through the "read-only" relationships.
    Any hint how to do that ?

    Marcin



    This archive was generated by hypermail 2.0.0 : Wed Aug 15 2007 - 01:54:08 EDT