Return-Path: Delivered-To: apmail-cayenne-user-archive@www.apache.org Received: (qmail 94018 invoked from network); 15 Aug 2007 05:54:04 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 15 Aug 2007 05:54:04 -0000 Received: (qmail 20516 invoked by uid 500); 15 Aug 2007 05:54:02 -0000 Delivered-To: apmail-cayenne-user-archive@cayenne.apache.org Received: (qmail 20340 invoked by uid 500); 15 Aug 2007 05:54:02 -0000 Mailing-List: contact user-help@cayenne.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user@cayenne.apache.org Delivered-To: mailing list user@cayenne.apache.org Received: (qmail 20331 invoked by uid 99); 15 Aug 2007 05:54:01 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 14 Aug 2007 22:54:01 -0700 X-ASF-Spam-Status: No, hits=-0.0 required=10.0 tests=SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: domain of marcin@ish.com.au designates 59.167.240.32 as permitted sender) Received: from [59.167.240.32] (HELO fish.ish.com.au) (59.167.240.32) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 15 Aug 2007 05:54:12 +0000 Received: from [10.194.9.2] (helo=[10.194.9.2]) by fish.ish.com.au with esmtp (Exim 4.43) id 1ILBon-0008Vq-4J for user@cayenne.apache.org; Wed, 15 Aug 2007 15:53:23 +1000 Mime-Version: 1.0 (Apple Message framework v752.3) Content-Transfer-Encoding: 7bit Message-Id: Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed To: user@cayenne.apache.org From: Marcin Skladaniec Subject: ROP, flattened relationships and no-reverse relationship and/or dotemplates Date: Wed, 15 Aug 2007 15:53:25 +1000 X-Mailer: Apple Mail (2.752.3) X-Spam-Score: -1.4 (-) X-Spam-Report: -1.4 ALL_TRUSTED Passed through trusted hosts only via SMTP X-Virus-Checked: Checked by ClamAV on apache.org 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): 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. (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) : 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