cayenne-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrus Adamchik <>
Subject ROP [Was: [jira] [Commented] (CAY-2038) Hessian serialization error when using JSR-310 Date types with ROP]
Date Sat, 12 Dec 2015 20:00:34 GMT
Another possible direction with ROP is to strip it down to a very simple and performant "ORM

* define a protocol for protobuf and JSON serialization (still need to look at Kryo). Limit
it to the smallest usable subset of queries (EJBQL is a good candidate ... any other object
select can be translated to it) and generic update operations.
* make the server generic - use generic entities instead of precompiled Java classes.
* remove stateful ObjectContext layer from the server. Perhaps serialize DataRows directly
(can be tricky with prefetching, but doable). Will still need request-scoped ObjectContext
for commits I guess.

While this will take away the ability to add business logic to the server, it has a number
of advantages too:

* no more modeling the client and server separately and messing with 2 sets of classes
* possible to package server as a reusable Docker image that will automatically run against
any DB (perhaps with auto reverse engineering of the model [1]).
* simplicity of writing a client. E.g. Apple just open-sourced Swift. To the best of my knowledge
Swift has no decent DB drivers or ORM. A reusable Java/Cayenne proxy with clear protocol would
allow writing a Swift ORM with a fairly low effort. Same goes for other languages. 
* even LinkRest can probably use such an ORM proxy via a Java ROP client


[1] Imagine you do this:

# Docker used as an example; proxy can be packaged in many different ways
$ docker pull cayenne/proxy

# Start the proxy. On first run it reverse-engineers 
# the DB and drops the XML somewhere
$ docker -p 1234:1234 run cayenne/proxy <db_url>

# you open XML with the Modeler, 
# tweak it to your liking, save and put in Git
# the server auto-reloads
# On subsequnt runs, DB changes are detected and merged into the Model

# "client" is the client to the proxy; 
# it can actually be a server-side app
cd client/
mvn cgen-from-proxy

# now you have your app...

View raw message