Creating multiple datamaps on the fly

3 messages Options
Embed this post
Permalink
Lawrence Gerstley

Creating multiple datamaps on the fly

Reply Threaded More More options
Print post
Permalink
Hello,

I'm trying to create multiple DataMaps and attach them to my  
DataDomain on the fly in an application. The DataMap itself that I  
created with the modeler is fine, but I want to be able to create new  
ones on demand to point to a new table set in my db. So, my DataMap  
might consist of DbEntities whose prefixes all start with "lba1_". I  
can iterate through the map attached to the domain loaded up like so:
================================================================
for (DbEntity entity : currentMap.getDbEntities()) {
   if (entity.getName().indexOf("_") > 0) {
     entity.setName(entity.getName().replaceFirst(".*_",  
instancePrefix + "_"));
   }
}
================================================================
I'd like to clone the DataMap and then iterate through it with the  
code above, and then add that DataMap to the DataDomain. Is that  
possible?

Thanks,

Lawrence

Andrey Razumovsky

Re: Creating multiple datamaps on the fly

Reply Threaded More More options
Print post
Permalink
Hi,

I'm not sure that I correctly understood your problem, but cloning datamap
is definitely possible. Alas, I don't know about any ready methods for that.
You can either clone DataMap manually (i.e. create new map with new name,
copy properties from original map, put there entities etc. with new names
and then attach it to domain) or clone whole datamap via serialization and
then change names of its "entries". Sort of second way is implemented in
modeler's PasteAction.paste(...). Note that entity names must be unique in
whole DataDomain.

Andrey

2009/6/4 Lawrence Gerstley <[hidden email]>

> Hello,
>
> I'm trying to create multiple DataMaps and attach them to my DataDomain on
> the fly in an application. The DataMap itself that I created with the
> modeler is fine, but I want to be able to create new ones on demand to point
> to a new table set in my db. So, my DataMap might consist of DbEntities
> whose prefixes all start with "lba1_". I can iterate through the map
> attached to the domain loaded up like so:
> ================================================================
> for (DbEntity entity : currentMap.getDbEntities()) {
>  if (entity.getName().indexOf("_") > 0) {
>    entity.setName(entity.getName().replaceFirst(".*_", instancePrefix +
> "_"));
>  }
> }
> ================================================================
> I'd like to clone the DataMap and then iterate through it with the code
> above, and then add that DataMap to the DataDomain. Is that possible?
>
> Thanks,
>
> Lawrence
>
>
Lawrence Gerstley

Re: Creating multiple datamaps on the fly

Reply Threaded More More options
Print post
Permalink
Hello,
Some time ago, I asked about creating multiple datamaps by cloning an
existing one, which worked fine initially, and now I find an odd hiccup when
using the cloned datamap for something more involved than a simple
SelectQuery. When I try to perform a query with a simple
"likeIgnoreCaseExp", I get the following exception:

*No reverse relationship exist for
org.apache.cayenne.map.DbRelationship@8ddb93
[name=toSourceEntity,toMany=false]*


When I debug my cloning code, part of it cycles through the DbEntities with
this method:
    public DbEntity cloneDbEntity(DbEntity originalDbEntity, String
newDbEntityName) {
        DbEntity returnDbEntity = new DbEntity(newDbEntityName);
        returnDbEntity.setSchema(originalDbEntity.getSchema());
        returnDbEntity.setCatalog(originalDbEntity.getCatalog());
        for (DbAttribute dbAttribute : originalDbEntity.getAttributes()) {
            returnDbEntity.addAttribute(dbAttribute);
        }
        for (DbRelationship dbRelationship :
originalDbEntity.getRelationships()) {
            returnDbEntity.addRelationship(dbRelationship);
        }
        return returnDbEntity;
    }

When I look at the dbRelationships that are iterated through, each have a
properly defined reverseRelationship. When I inspect the returnDbEntity that
is produced, I get the exception:

Entity 'assoc' has no parent MappingNamespace (such as DataMap)


This error may be nothing--the map appears to work, but I'm still stymied by
the lack of a reverse relationship when I go to execute the SelectQuery. Can
anyone tell what I am missing here? Is there a better example of cloning a
DataMap?

Thanks,

Lawrence

On Thu, Jun 4, 2009 at 11:01 AM, Lawrence Gerstley <[hidden email]>wrote:

> ---------- Forwarded message ----------
> From: Andrey Razumovsky <[hidden email]>
> Date: Thu, Jun 4, 2009 at 4:21 AM
> Subject: Re: Creating multiple datamaps on the fly
> To: [hidden email]
>
>
> Hi,
>
> I'm not sure that I correctly understood your problem, but cloning datamap
> is definitely possible. Alas, I don't know about any ready methods for
> that.
> You can either clone DataMap manually (i.e. create new map with new name,
> copy properties from original map, put there entities etc. with new names
> and then attach it to domain) or clone whole datamap via serialization and
> then change names of its "entries". Sort of second way is implemented in
> modeler's PasteAction.paste(...). Note that entity names must be unique in
> whole DataDomain.
>
> Andrey
>
> 2009/6/4 Lawrence Gerstley <[hidden email]>
>
> > Hello,
> >
> > I'm trying to create multiple DataMaps and attach them to my DataDomain
> on
> > the fly in an application. The DataMap itself that I created with the
> > modeler is fine, but I want to be able to create new ones on demand to
> point
> > to a new table set in my db. So, my DataMap might consist of DbEntities
> > whose prefixes all start with "lba1_". I can iterate through the map
> > attached to the domain loaded up like so:
> > ================================================================
> > for (DbEntity entity : currentMap.getDbEntities()) {
> >  if (entity.getName().indexOf("_") > 0) {
> >    entity.setName(entity.getName().replaceFirst(".*_", instancePrefix +
> > "_"));
> >  }
> > }
> > ================================================================
> > I'd like to clone the DataMap and then iterate through it with the code
> > above, and then add that DataMap to the DataDomain. Is that possible?
> >
> > Thanks,
> >
> > Lawrence
> >
> >
>
>
>
> --
> ============================
> Lawrence Gerstley, Ph.D.
> PSMI Consulting
>
> Cel: 415.694-0844
>



--
============================
Lawrence Gerstley, Ph.D.
PSMI Consulting

Cel: 415.694-0844