You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cayenne.apache.org by Chris Murphy <ch...@strandz.org> on 2008/09/30 07:10:57 UTC

ROP - server DOs to client DOs failure

I have a problem that occurs when a fetch is done from the ROP client, 
which causes the server to load client DOs using the values from server DOs:

<
Can not set java.lang.Byte field 
org.strandz.data.wombatrescue.objects.cayenne.client.auto._RosterSlot.monthlyRestart 
to java.lang.Integer
 >

I have checked that all the latest code and mapping information is on 
the Tomcat server. The problem occurs when re-fetching a RosterSlot that 
the client application created. What is interesting is that if I reboot 
Tomcat then everything works as expected - showing that the new 
RosterSlot did in fact make it successfully into the database. So it is 
a ROP database refresh problem.

Is there anything else I need to check, or some easy way of debugging 
this? _RosterSlot.monthlyRestart is a Byte variable in both client and 
server versions of the DO. I do have methods on the subclasses that 
serve to convert between Byte/Integer/boolean:

    public boolean isMonthlyRestart()
    {
        boolean result = true;
        if(getMonthlyRestart().intValue() == 0)
        {
            result = false;
        }
        return result;
    }

    public void setMonthlyRestart( boolean b)
    {
        if(b)
        {
            setMonthlyRestart( Utils.ONE.byteValue());
        }
        else
        {
            setMonthlyRestart( Utils.ZERO.byteValue());
        }
    }

 From the Modeller I can see that MONTHLYRESTART is a TINYINT in the 
MySql database and in the DO the Java Type is a Byte.

thanks - Chris

Some of the stack trace from the client:
org.apache.cayenne.CayenneRuntimeException: [v.2.0.4 October 8 2007] 
Remote error. URL - 
http://localhost:8080/cayenneRemoteService/cayenne-service; CAUSE - Can 
not set java.lang.Byte field 
org.strandz.data.wombatrescue.objects.cayenne.client.auto._RosterSlot.monthlyRestart 
to java.lang.Integer
    at 
org.apache.cayenne.remote.hessian.HessianConnection.doSendMessage(HessianConnection.java:145)
    at 
org.apache.cayenne.remote.BaseConnection.sendMessage(BaseConnection.java:73)
    at org.apache.cayenne.remote.ClientChannel.send(ClientChannel.java:242)
    at 
org.apache.cayenne.remote.ClientChannel.onQuery(ClientChannel.java:88)
    at 
org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:217)
    at 
org.apache.cayenne.CayenneContextQueryAction.execute(CayenneContextQueryAction.java:47)
    at org.apache.cayenne.CayenneContext.onQuery(CayenneContext.java:290)
    at 
org.apache.cayenne.CayenneContext.performQuery(CayenneContext.java:279)
    at 
org.apache.cayenne.util.RelationshipFault.resolveFromDB(RelationshipFault.java:90)
    at 
org.apache.cayenne.util.PersistentObjectList.resolvedObjectList(PersistentObjectList.java:299)
    at 
org.apache.cayenne.util.PersistentObjectList.iterator(PersistentObjectList.java:209)
    at org.strandz.lgpl.extent.ActualList.iterator(ActualList.java:189)

Some of the stack trace from the server:

Caused by: java.lang.IllegalArgumentException: Can not set 
java.lang.Byte field 
org.strandz.data.wombatrescue.objects.cayenne.client.auto._RosterSlot.monthlyRestart 
to java.lang.Integer
    at 
sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)
    at 
sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150)
    at 
sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63)
    at java.lang.reflect.Field.set(Field.java:657)
    at 
org.apache.cayenne.property.FieldAccessor.writePropertyDirectly(FieldAccessor.java:79)
    at 
org.apache.cayenne.property.SimpleProperty.writePropertyDirectly(SimpleProperty.java:83)
    at 
org.apache.cayenne.property.SimpleProperty.writeProperty(SimpleProperty.java:54)
    at 
org.apache.cayenne.map.EntityDescriptor$SimplePersistentProperty.writeProperty(EntityDescriptor.java:305)
    at 
org.apache.cayenne.util.ObjectDetachOperation$1.visitProperty(ObjectDetachOperation.java:159)
    at 
org.apache.cayenne.property.SimpleProperty.visit(SimpleProperty.java:62)
    at 
org.apache.cayenne.property.BaseClassDescriptor.visitProperties(BaseClassDescriptor.java:214)
    at 
org.apache.cayenne.util.ObjectDetachOperation.detach(ObjectDetachOperation.java:98)
    at 
org.apache.cayenne.access.ClientServerChannelQueryAction.toClientObjects(ClientServerChannelQueryAction.java:185)

-- 
Seaweed Software Pty Ltd,
http://www.strandz.org


Re: ROP - server DOs to client DOs failure

Posted by Andrus Adamchik <an...@objectstyle.org>.
> Shouldn't the signatures be the same?

Yeah... Looking at the client templates, there's no explicit handling  
of boolean attributes. This probably also means that primitives  
haven't been fully tested with ROP. Let me open a Jira on that.

Thanks,
Andrus



On Sep 30, 2008, at 8:25 PM, Chris Murphy wrote:

>
> Using 3.0 and setting Java Type for RosterSlot the in the Modeller  
> to a boolean, then generating the classes, then getting rid of the  
> extra methods - fixed the problem.
>
> One slightly strange thing I noticed. In the client version the  
> generated class is:   public boolean getMonthlyRestart()
> ,
> but on the server version it is:
> public boolean isMonthlyRestart()
> Shouldn't the signatures be the same?
>
> thanks - Chris
>
> Andrus Adamchik wrote:
>> Can't say for sure what this is, but can you try it with 3.0?
>>
>> BTW, 3.0 supports direct mapping of primitive booleans (boolean for  
>> the ObjAttribute; BOOLEAN for the DbAttribute; TINYINT in MySQL)
>>
>> Andrus
>>
>> On Sep 30, 2008, at 8:10 AM, Chris Murphy wrote:
>>
>>>
>>> I have a problem that occurs when a fetch is done from the ROP  
>>> client, which causes the server to load client DOs using the  
>>> values from server DOs:
>>>
>>> <
>>> Can not set java.lang.Byte field  
>>> org 
>>> .strandz 
>>> .data 
>>> .wombatrescue 
>>> .objects.cayenne.client.auto._RosterSlot.monthlyRestart to  
>>> java.lang.Integer
>>> >
>>>
>>> I have checked that all the latest code and mapping information is  
>>> on the Tomcat server. The problem occurs when re-fetching a  
>>> RosterSlot that the client application created. What is  
>>> interesting is that if I reboot Tomcat then everything works as  
>>> expected - showing that the new RosterSlot did in fact make it  
>>> successfully into the database. So it is a ROP database refresh  
>>> problem.
>>>
>>> Is there anything else I need to check, or some easy way of  
>>> debugging this? _RosterSlot.monthlyRestart is a Byte variable in  
>>> both client and server versions of the DO. I do have methods on  
>>> the subclasses that serve to convert between Byte/Integer/boolean:
>>>
>>>  public boolean isMonthlyRestart()
>>>  {
>>>      boolean result = true;
>>>      if(getMonthlyRestart().intValue() == 0)
>>>      {
>>>          result = false;
>>>      }
>>>      return result;
>>>  }
>>>
>>>  public void setMonthlyRestart( boolean b)
>>>  {
>>>      if(b)
>>>      {
>>>          setMonthlyRestart( Utils.ONE.byteValue());
>>>      }
>>>      else
>>>      {
>>>          setMonthlyRestart( Utils.ZERO.byteValue());
>>>      }
>>>  }
>>>
>>> From the Modeller I can see that MONTHLYRESTART is a TINYINT in  
>>> the MySql database and in the DO the Java Type is a Byte.
>>>
>>> thanks - Chris
>>>
>>> Some of the stack trace from the client:
>>> org.apache.cayenne.CayenneRuntimeException: [v.2.0.4 October 8  
>>> 2007] Remote error. URL - http://localhost:8080/cayenneRemoteService/cayenne-service 
>>> ; CAUSE - Can not set java.lang.Byte field  
>>> org 
>>> .strandz 
>>> .data 
>>> .wombatrescue 
>>> .objects.cayenne.client.auto._RosterSlot.monthlyRestart to  
>>> java.lang.Integer
>>>  at  
>>> org 
>>> .apache 
>>> .cayenne 
>>> .remote 
>>> .hessian.HessianConnection.doSendMessage(HessianConnection.java:145)
>>>  at  
>>> org 
>>> .apache 
>>> .cayenne.remote.BaseConnection.sendMessage(BaseConnection.java:73)
>>>  at  
>>> org.apache.cayenne.remote.ClientChannel.send(ClientChannel.java:242)
>>>  at  
>>> org.apache.cayenne.remote.ClientChannel.onQuery(ClientChannel.java: 
>>> 88)
>>>  at  
>>> org 
>>> .apache 
>>> .cayenne 
>>> .util 
>>> .ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java: 
>>> 217)
>>>  at  
>>> org 
>>> .apache 
>>> .cayenne 
>>> .CayenneContextQueryAction.execute(CayenneContextQueryAction.java: 
>>> 47)
>>>  at org.apache.cayenne.CayenneContext.onQuery(CayenneContext.java: 
>>> 290)
>>>  at  
>>> org.apache.cayenne.CayenneContext.performQuery(CayenneContext.java: 
>>> 279)
>>>  at  
>>> org 
>>> .apache 
>>> .cayenne 
>>> .util.RelationshipFault.resolveFromDB(RelationshipFault.java:90)
>>>  at  
>>> org 
>>> .apache 
>>> .cayenne 
>>> .util 
>>> .PersistentObjectList.resolvedObjectList(PersistentObjectList.java: 
>>> 299)
>>>  at  
>>> org 
>>> .apache 
>>> .cayenne 
>>> .util.PersistentObjectList.iterator(PersistentObjectList.java:209)
>>>  at org.strandz.lgpl.extent.ActualList.iterator(ActualList.java:189)
>>>
>>> Some of the stack trace from the server:
>>>
>>> Caused by: java.lang.IllegalArgumentException: Can not set  
>>> java.lang.Byte field  
>>> org 
>>> .strandz 
>>> .data 
>>> .wombatrescue 
>>> .objects.cayenne.client.auto._RosterSlot.monthlyRestart to  
>>> java.lang.Integer
>>>  at  
>>> sun 
>>> .reflect 
>>> .UnsafeFieldAccessorImpl 
>>> .throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)
>>>  at  
>>> sun 
>>> .reflect 
>>> .UnsafeFieldAccessorImpl 
>>> .throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150)
>>>  at  
>>> sun 
>>> .reflect 
>>> .UnsafeObjectFieldAccessorImpl 
>>> .set(UnsafeObjectFieldAccessorImpl.java:63)
>>>  at java.lang.reflect.Field.set(Field.java:657)
>>>  at  
>>> org 
>>> .apache 
>>> .cayenne 
>>> .property.FieldAccessor.writePropertyDirectly(FieldAccessor.java:79)
>>>  at  
>>> org 
>>> .apache 
>>> .cayenne 
>>> .property.SimpleProperty.writePropertyDirectly(SimpleProperty.java: 
>>> 83)
>>>  at  
>>> org 
>>> .apache 
>>> .cayenne.property.SimpleProperty.writeProperty(SimpleProperty.java: 
>>> 54)
>>>  at org.apache.cayenne.map.EntityDescriptor 
>>> $SimplePersistentProperty.writeProperty(EntityDescriptor.java:305)
>>>  at org.apache.cayenne.util.ObjectDetachOperation 
>>> $1.visitProperty(ObjectDetachOperation.java:159)
>>>  at  
>>> org 
>>> .apache.cayenne.property.SimpleProperty.visit(SimpleProperty.java: 
>>> 62)
>>>  at  
>>> org 
>>> .apache 
>>> .cayenne 
>>> .property 
>>> .BaseClassDescriptor.visitProperties(BaseClassDescriptor.java:214)
>>>  at  
>>> org 
>>> .apache 
>>> .cayenne 
>>> .util.ObjectDetachOperation.detach(ObjectDetachOperation.java:98)
>>>  at  
>>> org 
>>> .apache 
>>> .cayenne 
>>> .access 
>>> .ClientServerChannelQueryAction 
>>> .toClientObjects(ClientServerChannelQueryAction.java:185)
>>>
>>> -- 
>>> Seaweed Software Pty Ltd,
>>> http://www.strandz.org
>>>
>>>
>>
>>
>>
>
> -- 
> Seaweed Software Pty Ltd,
> http://www.strandz.org
>
>


Re: ROP - server DOs to client DOs failure

Posted by Chris Murphy <ch...@strandz.org>.
Using 3.0 and setting Java Type for RosterSlot the in the Modeller to a 
boolean, then generating the classes, then getting rid of the extra 
methods - fixed the problem.

One slightly strange thing I noticed. In the client version the 
generated class is:   
public boolean getMonthlyRestart()
,
but on the server version it is:
public boolean isMonthlyRestart() 

Shouldn't the signatures be the same?

thanks - Chris

Andrus Adamchik wrote:
> Can't say for sure what this is, but can you try it with 3.0?
>
> BTW, 3.0 supports direct mapping of primitive booleans (boolean for 
> the ObjAttribute; BOOLEAN for the DbAttribute; TINYINT in MySQL)
>
> Andrus
>
> On Sep 30, 2008, at 8:10 AM, Chris Murphy wrote:
>
>>
>> I have a problem that occurs when a fetch is done from the ROP 
>> client, which causes the server to load client DOs using the values 
>> from server DOs:
>>
>> <
>> Can not set java.lang.Byte field 
>> org.strandz.data.wombatrescue.objects.cayenne.client.auto._RosterSlot.monthlyRestart 
>> to java.lang.Integer
>> >
>>
>> I have checked that all the latest code and mapping information is on 
>> the Tomcat server. The problem occurs when re-fetching a RosterSlot 
>> that the client application created. What is interesting is that if I 
>> reboot Tomcat then everything works as expected - showing that the 
>> new RosterSlot did in fact make it successfully into the database. So 
>> it is a ROP database refresh problem.
>>
>> Is there anything else I need to check, or some easy way of debugging 
>> this? _RosterSlot.monthlyRestart is a Byte variable in both client 
>> and server versions of the DO. I do have methods on the subclasses 
>> that serve to convert between Byte/Integer/boolean:
>>
>>   public boolean isMonthlyRestart()
>>   {
>>       boolean result = true;
>>       if(getMonthlyRestart().intValue() == 0)
>>       {
>>           result = false;
>>       }
>>       return result;
>>   }
>>
>>   public void setMonthlyRestart( boolean b)
>>   {
>>       if(b)
>>       {
>>           setMonthlyRestart( Utils.ONE.byteValue());
>>       }
>>       else
>>       {
>>           setMonthlyRestart( Utils.ZERO.byteValue());
>>       }
>>   }
>>
>> From the Modeller I can see that MONTHLYRESTART is a TINYINT in the 
>> MySql database and in the DO the Java Type is a Byte.
>>
>> thanks - Chris
>>
>> Some of the stack trace from the client:
>> org.apache.cayenne.CayenneRuntimeException: [v.2.0.4 October 8 2007] 
>> Remote error. URL - 
>> http://localhost:8080/cayenneRemoteService/cayenne-service; CAUSE - 
>> Can not set java.lang.Byte field 
>> org.strandz.data.wombatrescue.objects.cayenne.client.auto._RosterSlot.monthlyRestart 
>> to java.lang.Integer
>>   at 
>> org.apache.cayenne.remote.hessian.HessianConnection.doSendMessage(HessianConnection.java:145) 
>>
>>   at 
>> org.apache.cayenne.remote.BaseConnection.sendMessage(BaseConnection.java:73) 
>>
>>   at 
>> org.apache.cayenne.remote.ClientChannel.send(ClientChannel.java:242)
>>   at 
>> org.apache.cayenne.remote.ClientChannel.onQuery(ClientChannel.java:88)
>>   at 
>> org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:217) 
>>
>>   at 
>> org.apache.cayenne.CayenneContextQueryAction.execute(CayenneContextQueryAction.java:47) 
>>
>>   at org.apache.cayenne.CayenneContext.onQuery(CayenneContext.java:290)
>>   at 
>> org.apache.cayenne.CayenneContext.performQuery(CayenneContext.java:279)
>>   at 
>> org.apache.cayenne.util.RelationshipFault.resolveFromDB(RelationshipFault.java:90) 
>>
>>   at 
>> org.apache.cayenne.util.PersistentObjectList.resolvedObjectList(PersistentObjectList.java:299) 
>>
>>   at 
>> org.apache.cayenne.util.PersistentObjectList.iterator(PersistentObjectList.java:209) 
>>
>>   at org.strandz.lgpl.extent.ActualList.iterator(ActualList.java:189)
>>
>> Some of the stack trace from the server:
>>
>> Caused by: java.lang.IllegalArgumentException: Can not set 
>> java.lang.Byte field 
>> org.strandz.data.wombatrescue.objects.cayenne.client.auto._RosterSlot.monthlyRestart 
>> to java.lang.Integer
>>   at 
>> sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146) 
>>
>>   at 
>> sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150) 
>>
>>   at 
>> sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:63) 
>>
>>   at java.lang.reflect.Field.set(Field.java:657)
>>   at 
>> org.apache.cayenne.property.FieldAccessor.writePropertyDirectly(FieldAccessor.java:79) 
>>
>>   at 
>> org.apache.cayenne.property.SimpleProperty.writePropertyDirectly(SimpleProperty.java:83) 
>>
>>   at 
>> org.apache.cayenne.property.SimpleProperty.writeProperty(SimpleProperty.java:54) 
>>
>>   at 
>> org.apache.cayenne.map.EntityDescriptor$SimplePersistentProperty.writeProperty(EntityDescriptor.java:305) 
>>
>>   at 
>> org.apache.cayenne.util.ObjectDetachOperation$1.visitProperty(ObjectDetachOperation.java:159) 
>>
>>   at 
>> org.apache.cayenne.property.SimpleProperty.visit(SimpleProperty.java:62)
>>   at 
>> org.apache.cayenne.property.BaseClassDescriptor.visitProperties(BaseClassDescriptor.java:214) 
>>
>>   at 
>> org.apache.cayenne.util.ObjectDetachOperation.detach(ObjectDetachOperation.java:98) 
>>
>>   at 
>> org.apache.cayenne.access.ClientServerChannelQueryAction.toClientObjects(ClientServerChannelQueryAction.java:185) 
>>
>>
>> -- 
>> Seaweed Software Pty Ltd,
>> http://www.strandz.org
>>
>>
>
>
>

-- 
Seaweed Software Pty Ltd,
http://www.strandz.org


Re: ROP - server DOs to client DOs failure

Posted by Andrus Adamchik <an...@objectstyle.org>.
Can't say for sure what this is, but can you try it with 3.0?

BTW, 3.0 supports direct mapping of primitive booleans (boolean for  
the ObjAttribute; BOOLEAN for the DbAttribute; TINYINT in MySQL)

Andrus

On Sep 30, 2008, at 8:10 AM, Chris Murphy wrote:

>
> I have a problem that occurs when a fetch is done from the ROP  
> client, which causes the server to load client DOs using the values  
> from server DOs:
>
> <
> Can not set java.lang.Byte field  
> org 
> .strandz 
> .data 
> .wombatrescue.objects.cayenne.client.auto._RosterSlot.monthlyRestart  
> to java.lang.Integer
> >
>
> I have checked that all the latest code and mapping information is  
> on the Tomcat server. The problem occurs when re-fetching a  
> RosterSlot that the client application created. What is interesting  
> is that if I reboot Tomcat then everything works as expected -  
> showing that the new RosterSlot did in fact make it successfully  
> into the database. So it is a ROP database refresh problem.
>
> Is there anything else I need to check, or some easy way of  
> debugging this? _RosterSlot.monthlyRestart is a Byte variable in  
> both client and server versions of the DO. I do have methods on the  
> subclasses that serve to convert between Byte/Integer/boolean:
>
>   public boolean isMonthlyRestart()
>   {
>       boolean result = true;
>       if(getMonthlyRestart().intValue() == 0)
>       {
>           result = false;
>       }
>       return result;
>   }
>
>   public void setMonthlyRestart( boolean b)
>   {
>       if(b)
>       {
>           setMonthlyRestart( Utils.ONE.byteValue());
>       }
>       else
>       {
>           setMonthlyRestart( Utils.ZERO.byteValue());
>       }
>   }
>
> From the Modeller I can see that MONTHLYRESTART is a TINYINT in the  
> MySql database and in the DO the Java Type is a Byte.
>
> thanks - Chris
>
> Some of the stack trace from the client:
> org.apache.cayenne.CayenneRuntimeException: [v.2.0.4 October 8 2007]  
> Remote error. URL - http://localhost:8080/cayenneRemoteService/cayenne-service 
> ; CAUSE - Can not set java.lang.Byte field  
> org 
> .strandz 
> .data 
> .wombatrescue.objects.cayenne.client.auto._RosterSlot.monthlyRestart  
> to java.lang.Integer
>   at  
> org 
> .apache 
> .cayenne 
> .remote 
> .hessian.HessianConnection.doSendMessage(HessianConnection.java:145)
>   at  
> org 
> .apache 
> .cayenne.remote.BaseConnection.sendMessage(BaseConnection.java:73)
>   at org.apache.cayenne.remote.ClientChannel.send(ClientChannel.java: 
> 242)
>   at  
> org.apache.cayenne.remote.ClientChannel.onQuery(ClientChannel.java:88)
>   at  
> org 
> .apache 
> .cayenne 
> .util 
> .ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:217)
>   at  
> org 
> .apache 
> .cayenne 
> .CayenneContextQueryAction.execute(CayenneContextQueryAction.java:47)
>   at org.apache.cayenne.CayenneContext.onQuery(CayenneContext.java: 
> 290)
>   at  
> org.apache.cayenne.CayenneContext.performQuery(CayenneContext.java: 
> 279)
>   at  
> org 
> .apache 
> .cayenne.util.RelationshipFault.resolveFromDB(RelationshipFault.java: 
> 90)
>   at  
> org 
> .apache 
> .cayenne 
> .util 
> .PersistentObjectList.resolvedObjectList(PersistentObjectList.java: 
> 299)
>   at  
> org 
> .apache 
> .cayenne 
> .util.PersistentObjectList.iterator(PersistentObjectList.java:209)
>   at org.strandz.lgpl.extent.ActualList.iterator(ActualList.java:189)
>
> Some of the stack trace from the server:
>
> Caused by: java.lang.IllegalArgumentException: Can not set  
> java.lang.Byte field  
> org 
> .strandz 
> .data 
> .wombatrescue.objects.cayenne.client.auto._RosterSlot.monthlyRestart  
> to java.lang.Integer
>   at  
> sun 
> .reflect 
> .UnsafeFieldAccessorImpl 
> .throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)
>   at  
> sun 
> .reflect 
> .UnsafeFieldAccessorImpl 
> .throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150)
>   at  
> sun 
> .reflect 
> .UnsafeObjectFieldAccessorImpl 
> .set(UnsafeObjectFieldAccessorImpl.java:63)
>   at java.lang.reflect.Field.set(Field.java:657)
>   at  
> org 
> .apache 
> .cayenne 
> .property.FieldAccessor.writePropertyDirectly(FieldAccessor.java:79)
>   at  
> org 
> .apache 
> .cayenne 
> .property.SimpleProperty.writePropertyDirectly(SimpleProperty.java:83)
>   at  
> org 
> .apache 
> .cayenne.property.SimpleProperty.writeProperty(SimpleProperty.java:54)
>   at org.apache.cayenne.map.EntityDescriptor 
> $SimplePersistentProperty.writeProperty(EntityDescriptor.java:305)
>   at org.apache.cayenne.util.ObjectDetachOperation 
> $1.visitProperty(ObjectDetachOperation.java:159)
>   at  
> org.apache.cayenne.property.SimpleProperty.visit(SimpleProperty.java: 
> 62)
>   at  
> org 
> .apache 
> .cayenne 
> .property 
> .BaseClassDescriptor.visitProperties(BaseClassDescriptor.java:214)
>   at  
> org 
> .apache 
> .cayenne 
> .util.ObjectDetachOperation.detach(ObjectDetachOperation.java:98)
>   at  
> org 
> .apache 
> .cayenne 
> .access 
> .ClientServerChannelQueryAction 
> .toClientObjects(ClientServerChannelQueryAction.java:185)
>
> -- 
> Seaweed Software Pty Ltd,
> http://www.strandz.org
>
>