cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Emanuele Maiarelli <maiarelli.emanu...@gmail.com>
Subject A note on postgres multitenat implementation with 1 schema per tenant
Date Mon, 11 Nov 2013 01:25:54 GMT
I was doing some tests on multitenancy implementations using cayenee 3.1
beta 2 and postgres , using 1 schema per tenant.

I instancend one ServerRuntime per tennant this way:

   public static ServerRuntime createServerRuntime(final String
tenantSchema) {

        ServerRuntime runtime = new ServerRuntime("/cayenne-...xml", new
Module() {

            public void configure(Binder binder) {

                binder.bind(DataMapLoader.class).toInstance(new
TenantMapLoader(tenantSchema));

            }

         // in a custom module override the schema of all loaded DataMaps
        });

        return runtime;
    }

    static 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);

                // workaround else cayenne would search for postgress
sequences
                // in public schema.

                String
sequence=tenantSchema.concat(".").concat(e.getPrimaryKeyGenerator().getGeneratorName());
                e.getPrimaryKeyGenerator().setGeneratorName(sequence);

            }

            return map;
        }
    }

I had to put a workaround for handling sequences in the right schema, else
cayenne would look in public schema (as performig a query in postgres
omitting the schema name will end peforming it in public schema).

Is there another way to specify to cayenne which schema must be used for
sequences?

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message