1. Serialization. There's not much to it really. Just make sure the context you are using is session-scoped. See for instance this class that provides a session-bound context (used by CayenneFilter) :
http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/web/SessionContextRequestHandler.java?view=markup 2. Multi-tenancy... So if you go with DB-schema per tenant, it might look like this: // do it once per tenant, and cache the returned runtime in the app scope ServerRuntime createServerRuntime(final String tenantSchema) { // "cayenne-xyz.xml" is a mapping common to all tenants, that will be further customized here ServerRuntime runtime = new ServerRuntime("cayenne-xyz.xml", new Module() { // in a custom module override the schema of all loaded DataMaps public void configure(Binder binder) { binder.bind(DataMapLoader.class).toInstance(new TenantMapLoader(tenantSchema)); } }); return runtime; } class TenantMapLoader extends XMLDataMapLoader { private String tenantSchema; TenantMapLoader(String tenantSchema) { this.tenantSchema = tenantSchema; } public DataMap load(Resource configurationResource) { DataMap map = super.load(configurationResource); map.setDefaultSchema(tenantSchema); for(DbEntity e : map.getDbEntities()) { e.setSchema(tenantSchema); } return map; } } Andrus On Aug 29, 2012, at 4:15 PM, Juan José Gil wrote: > Thanks for the reply Andrus! > > Could you point me to docs/samples about ObjectContext Serialization & > multi-tenant approaches you describe? > > About the"adding-metadata" part, I was thinking in adding constraints in a > similar way to active-record in RoR or GORM in grails, but using code > generation phases of cayenne. > > By now i'll use some kind of "typed" KVC delegating to cayenne the > properties access and then providing some kind a "class metadata" which can > be extended by subclasses... but i'll prefer the "code generation" form, so > I can use IDEs capabilities. > > maybe I'll generate some "java code configuration" which then will be used > to generate final classes... it sounds as a mess but it could give really > nice possibilities! don't you think? > > if i get to somewhere with this approach I'll tell you :) > >> >> >>> the data objects will reside at the http session, and will be used >> directly by the vaadin widgets, does this kind of cayenne data objects >> "use" could arrive with attaching/detaching problems? >> >> Shouldn't be a problem. You can store Cayenne objects in a session. The >> simplest way to avoid attach/detach issues is to have a session-scoped >> ObjectContext. Then it is serialized/deserialized together with the objects >> in case the session is saved to disk, or replicated across the cluster. >> >>> Also, is there a way to add metadata info in cayenne metamodel? I would >> like to add constraints / validations to generated classes, so they can be >> used to define searching criterias on indexed attributes (something like >> active-records class filters, but only on indexed properties) and generate >> model validations on properties so they can be used at UI fields directly, >> facilitating the app development. >> >> You can add extra info using callbacks or lifecycle listeners. Any extra >> properties can be defined either manually in generated subclasses, or even >> stored in the base CayenneDataObject (with 'readProperty' / 'writeProperty' >> methods, and custom property names). >> >>> Finally, I'm looking for a multitenant implementation to use, and I >> believe that the solution pointed at >> http://blog.jerodsanto.net/2011/07/building-multi-tenant-rails-apps-with-postgresql-schemas/could >> be also used with cayenne; is there any constraint I should look for? >> >> Cayenne is certainly friendly to various multi-tenancy approaches. In 3.1 >> API terms, you might assign a separate instance of ServerRuntime to each >> tenant, and use that to create ObjectContexts for its users. You may start >> all runtimes from the same basic configuration, and "namespace" them using >> tenant-unique DB URL. Or you may use a single DataSource, and after a >> runtime is loaded, scan through all its DbEntities and assign a tenant >> "schema" to them. Feel free to ask about further details. >> >> Andrus >> >> >> On Aug 26, 2012, at 5:15 PM, Juan J. Gil wrote: >>> Hello, I'm thinking to use cayenne in conjunction with vaadin ( >> http://vaadin.com). >>> >>> I'm trying to use some kind of tight integration between both frameworks >> (defining cayenne generated classes which are vaadin data models >> implementations). >>> That way I could define forms directly on data objects, querying & >> mutating its state directly from vaadin widgets. >>> As vaadin is an stateful web framework, should I have to expect for some >> kind of problem with data objects between requests? I mean, the data >> objects will reside at the http session, and will be used directly by the >> vaadin widgets, does this kind of cayenne data objects "use" could arrive >> with attaching/detaching problems? >>> >>> Also, is there a way to add metadata info in cayenne metamodel? I would >> like to add constraints / validations to generated classes, so they can be >> used to define searching criterias on indexed attributes (something like >> active-records class filters, but only on indexed properties) and generate >> model validations on properties so they can be used at UI fields directly, >> facilitating the app development. >>> >>> Finally, I'm looking for a multitenant implementation to use, and I >> believe that the solution pointed at >> http://blog.jerodsanto.net/2011/07/building-multi-tenant-rails-apps-with-postgresql-schemas/could >> be also used with cayenne; is there any constraint I should look for? >>> >>> Best regards >>> Juanjo >>> >>> ps: pardon my really poor English! :P >>> >>> >> >>
