In your app please keep using Guice. 

Cayenne DI (which is strongly inspired by Guice, but has much smaller 
footprint) is intended for configuring stuff inside Cayenne. The container 
itself is hidden inside CayenneRuntime and we are not promoting it for general 
app-level use, even though in theory it should be possible.

Andrus

On Aug 30, 2012, at 4:13 PM, Juan José Gil wrote:

> 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
>>>>> 
>>>>> 
>>>> 
>>>> 
>> 
>> 

Reply via email to