Re: Configuring custom key generator

From: Roger Parkinson (roge..enanque.co.nz)
Date: Fri Oct 27 2006 - 04:14:52 EDT

  • Next message: Borut Bolčina: "Re: Configuring custom key generator"

    I still need to know where to call something like this at run time so it kicks in for all the tables I use.
    I can get an adapter and tell it what PkGenerator to use on a case by case basis (as the example in my question shows)
    But how do I put it in there just once. I don't want to modify everywhere I get a DataContext.
    Is there some init hook?

    Roger

    Borut Bolčina wrote:

    Hello Roger,

    study the method bellow which creates tables on two databases based on info
    in datamaps created by modeler.

    hope it helps,
    Borut

      /**
       * Creates tables. This method is capable of creating tables on multiple
       * database servers, even mixed vendors.
       */
     ..uppressWarnings("unchecked")
      private void createTables() {
         MySQLAdapter mysqlDbAdapter = new MySQLAdapter();

         DbGenerator generator = null;

         // see http://issues.apache.org/cayenne/browse/CAY-527
         //PropertyUtils.setProperty(mysqlDbAdapter, "pkGenerator", new
    MyJdbcPkGenerator());

         List<DataMap> maps = (List) dataContext.getEntityResolver
    ().getDataMaps();
         for (DataMap dataMap : maps) {
            DataNode dataNode = dataContext.getParentDataDomain
    ().lookupDataNode(dataMap);
            DataSource dataSource = dataNode.getDataSource();
            MyJdbcPkGenerator myPkGenerator = null;
            if (dataMap.getName().equals("MyFirstDomainMap")) {
               mysqlDbAdapter.setSupportsFkConstraints(false);
               generator = new DbGenerator(mysqlDbAdapter, dataMap);

               generator.setShouldCreatePKSupport(false);
               generator.setShouldDropTables(false);
            } else if (dataMap.getName().equals("MySecondDomainMap")) {
               mysqlDbAdapter.setSupportsFkConstraints(true);
               myPkGenerator = new MyJdbcPkGenerator();
               myPkGenerator.setDataNode(dataNode);
               mysqlDbAdapter.setPkGenerator(myPkGenerator);
               generator = new DbGenerator(mysqlDbAdapter, dataMap);

               generator.setShouldCreatePKSupport(true);
               generator.setShouldCreateFKConstraints(true);
               generator.setShouldDropTables(false);
            }
            try {
               generator.runGenerator(dataSource);
            } catch (Exception e) {
               logger.error("Error running database generator for " +
    dataMap.getName(), e);
            }
         }
      }


    2006/10/26, Roger Parkinson <roger@senanque.co.nz>:

     I have extended JdbcPkGenerator to generate a custom primary key and it
    works fine in unit testing.
    How do I tell Cayenne to use my class instead of standard
    JdbcPkGenerator?

    Searching the messages reveals I should do something like:

    DbAdapter adapter = dataNode.getAdapter();
    PropertyUtils.setProperty(adapter,"pkGenerator",new MyJdbcPkGenerator());

    But I don't know where to actually put this code so that it will use my
    generator everywhere.
    Thanks
    --
    ------------------------------
    Roger Parkinson
    +64 21 508 792




    --

    Roger Parkinson
    +64 21 508 792



    This archive was generated by hypermail 2.0.0 : Fri Oct 27 2006 - 04:16:54 EDT