DDC-616: Reverse engineering with Oracle #5124

Closed
doctrinebot opened this Issue May 29, 2010 · 6 comments

2 participants

@doctrinebot

Jira issue originally created by user mikaelkael:

I am playing with reverse engineering with Oracle and I have some problems:

My schema:

create table TABLE_TEST1 (
   TEST1*FIRST*COLUMN      NUMBER(4)                       not null,
   TEST1*SECOND*COLUMN     VARCHAR2(50)                    not null,
   TEST1*THIRD*COLUMN      DATE,
   constraint PK*TABLE_TEST1 primary key (TEST1_FIRST*COLUMN)
         using index
       tablespace TBS_INDEX
       storage
       (
           initial 100K
           next 100K
       )
)
storage
(
    initial 100K
    next 100K
)
tablespace TBS_DATA;

create table TABLE_TEST2 (
   TEST2*FIRST*COLUMN      NUMBER(4)                       not null,
   TEST2*SECOND*COLUMN     VARCHAR2(50)                    not null,
   TEST2*THIRD*COLUMN      DATE,
   TEST1*FIRST*COLUMN      NUMBER(4)                       not null,
   constraint PK*TABLE_TEST2 primary key (TEST2_FIRST*COLUMN)
         using index
       tablespace TBS_INDEX
       storage
       (
           initial 100K
           next 100K
       )
)
storage
(
    initial 100K
    next 100K
)
tablespace TBS_DATA;

alter table TABLE_TEST2
   add constraint TABLE*TEST2__TABLE_TEST1 foreign key (TEST1_FIRST*COLUMN)
      references TABLE*TEST1 (TEST1_FIRST*COLUMN);

My reverse engineering code:

ini*set('display*errors', 1);
set*include_path(realpath(__DIR_* . '/../doctrine-orm/lib/'));

require 'Doctrine/Common/ClassLoader.php';
$classLoader = new \Doctrine\Common\ClassLoader('Doctrine', realpath(*_DIR_* . '/../doctrine-orm/lib/'));
$classLoader->register();

$config = new \Doctrine\ORM\Configuration;
$cache = new \Doctrine\Common\Cache\ApcCache;
$config->setMetadataCacheImpl($cache);
$driverImpl = $config->newDefaultAnnotationDriver(realpath(*_DIR_*. '/Infofab/Entities'));
$config->setMetadataDriverImpl($driverImpl);
$config->setQueryCacheImpl($cache);
$config->setProxyDir('Proxies');
$config->setProxyNamespace('Infofab');
$connectionOptions = array(
    'dbname' => 'bddmkk',
    'user' => 'doctrine',
    'password' => 'xxxxxxx',
    'host' => 'localhost',
    'driver' => 'pdo_oci',
    'driverOptions' => array(PDO::ATTR*CASE => PDO::CASE*LOWER)
);

$em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);

$sm = $em->getConnection()->getSchemaManager();

$em->getConfiguration()->setMetadataDriverImpl(
    new \Doctrine\ORM\Mapping\Driver\DatabaseDriver(
        $em->getConnection()->getSchemaManager()
    )
);

$cmf = new \Doctrine\ORM\Tools\DisconnectedClassMetadataFactory($em);
$metadata = $cmf->getAllMetadata();

$cme = new \Doctrine\ORM\Tools\Export\ClassMetadataExporter();
$exporter = $cme->getExporter('annotation', 'Infofab');
$exporter->setMetadata($metadata);
$etg = new \Doctrine\ORM\Tools\EntityGenerator;
$exporter->setEntityGenerator($etg);
$exporter->export();

If I run this code, I obtain 2 entities:

<?php
/****
 * TableTest1
 *
 * @Table(name="TABLE_TEST1")
 * @Entity
 */
class TableTest1
{
    /****
     * @var integer $test1FirstColumn
     *
     * @Column(name="TEST1*FIRST*COLUMN", type="integer", nullable=false)
     * @Id
     * @GeneratedValue(strategy="SEQUENCE")
     * @SequenceGenerator(sequenceName="TABLE*TEST1_TEST1_FIRST*COLUMN", allocationSize="10", initialValue="1")
     */
    private $test1FirstColumn;

    /****
     * @var string $test1SecondColumn
     *
     * @Column(name="TEST1*SECOND*COLUMN", type="string", length=50, nullable=false)
     */
    private $test1SecondColumn;

    /****
     * @var datetime $test1ThirdColumn
     *
     * @Column(name="TEST1*THIRD*COLUMN", type="datetime", nullable=true)
     */
    private $test1ThirdColumn;
}

and

<?php
/****
 * TableTest2
 *
 * @Table(name="TABLE_TEST2")
 * @Entity
 */
class TableTest2
{
    /****
     * @var integer $test2FirstColumn
     *
     * @Column(name="TEST2*FIRST*COLUMN", type="integer", nullable=false)
     * @Id
     * @GeneratedValue(strategy="SEQUENCE")
     * @SequenceGenerator(sequenceName="TABLE*TEST2_TEST2_FIRST*COLUMN", allocationSize="10", initialValue="1")
     */
    private $test2FirstColumn;

    /****
     * @var integer $test1FirstColumn
     *
     * @Column(name="TEST1*FIRST*COLUMN", type="integer", nullable=false)
     */
    private $test1FirstColumn;

    /****
     * @var string $test2SecondColumn
     *
     * @Column(name="TEST2*SECOND*COLUMN", type="string", length=50, nullable=false)
     */
    private $test2SecondColumn;

    /****
     * @var datetime $test2ThirdColumn
     *
     * @Column(name="TEST2*THIRD*COLUMN", type="datetime", nullable=true)
     */
    private $test2ThirdColumn;

    /****
     * @var TABLETEST1
     *
     * @OneToOne(targetEntity="TABLETEST1")
     * @JoinColumns({
     *   @JoinColumn(name="TEST1*FIRST_COLUMN", referencedColumnName="TEST1_FIRST*COLUMN")
     * })
     */
    private $tEST1FIRSTCOLUMN;
}

As you can see, it declares 2 times the same column: private $test1FirstColumn; and private $tEST1FIRSTCOLUMN;

@doctrinebot

Comment created by @beberlei:

Fixed and scheduled for BETA 3

@doctrinebot

Comment created by mikaelkael:

Something is broken with your commit:

Fatal error: Uncaught exception 'Doctrine\ORM\Mapping\MappingException' with message 'No identifier/primary key specified for Entity 'OUTILLAGE*OPERATION*COLLECTE'. Every Entity must have an identifier/primary key.' in /mkk01/doctrine/doctrine-orm/lib/Doctrine/ORM/Mapping/MappingException.php on line 37

Doctrine\ORM\Mapping\MappingException: No identifier/primary key specified for Entity 'OUTILLAGE*OPERATION*COLLECTE'. Every Entity must have an identifier/primary key. in /mkk01/doctrine/doctrine-orm/lib/Doctrine/ORM/Mapping/MappingException.php on line 37

In file 'lib/Doctrine/ORM/Mapping/Driver/DatabaseDriver.php ' (http://github.com/doctrine/doctrine2/commit/b7db8df7efed4517859be562fd58e6ce4cc6354a) around line 86, the iteration is not complete and it is not able to define the primary key

@doctrinebot

Comment created by @beberlei:

It seems the detection of many to many tables can cause severe problems. Some internal refactoring has to be done to get this reverse-engineering right.

@doctrinebot

Comment created by @beberlei:

This should now be finally solved. Many-To-Many tables are detected and supported in reverse engineering now.

@doctrinebot

Issue was closed with resolution "Fixed"

@beberlei beberlei was assigned by doctrinebot Dec 6, 2015
@doctrinebot doctrinebot added this to the 2.0-BETA3 milestone Dec 6, 2015
@doctrinebot doctrinebot closed this Dec 6, 2015
@doctrinebot doctrinebot added the Bug label Dec 7, 2015
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment