Re: Creating multiple datamaps on the fly

From: Lawrence Gerstley (lawger..mail.com)
Date: Wed Jul 08 2009 - 02:45:20 EDT

  • Next message: Donald Vrakking: "Prefetched objects aren't used (2.0.4)"

    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.DbRelationshi..ddb93
    [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 <lawger..mail.com>wrote:

    > ---------- Forwarded message ----------
    > From: Andrey Razumovsky <razumovsky.andre..mail.com>
    > Date: Thu, Jun 4, 2009 at 4:21 AM
    > Subject: Re: Creating multiple datamaps on the fly
    > To: use..ayenne.apache.org
    >
    >
    > 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 <lawger..mail.com>
    >
    > > 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



    This archive was generated by hypermail 2.0.0 : Wed Jul 08 2009 - 02:46:04 EDT