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



Reply via email to