cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Marcin Skladaniec <mar...@ish.com.au>
Subject ROP, flattened relationships and no-reverse relationship and/or dotemplates
Date Wed, 15 Aug 2007 05:53:25 GMT
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

Mime
View raw message