thanks Andrus! I'll give it a try :)
which are the pros of using cayenne di instead of guice? (I've already worked on integrating guice + vaadin + shiro and I don't want to loose all that effort :S) Regards Juanjo 2012/8/30 Andrus Adamchik <[email protected]> > 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/couldbe > 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/couldbe > also used with cayenne; is there any constraint I should look for? > >>> > >>> Best regards > >>> Juanjo > >>> > >>> ps: pardon my really poor English! :P > >>> > >>> > >> > >> > >
