2011-10-10 4 views
2

Est-il possible de mapper la même classe à la fois ORM et ODM en utilisant des annotations? Nous décidons de ce que nous devons utiliser, nous voulons donc effectuer des mesures de performance et nous voulons également pouvoir changer facilement les mappeurs de persistance. J'ai déjà fait l'unification du manager, maintenant je voudrais unifier les classes. Maintenant, j'ai une copie de chaque classe dans des espaces de noms séparés pour les entités et les documents que je trouve redondants.Doctrine 2 Mappage ODM ORM et MongoDB sur la même classe

J'ai lu cet article http://www.doctrine-project.org/docs/mongodb_odm/1.0/en/cookbook/mapping-classes-to-orm-and-odm.html, mais à la fin, je suppose qu'ils utilisent deux classes différentes, chacune dans leur propre espace de noms.

Quelqu'un a essayé cela?

Répondre

0

Je n'ai jamais essayé, mais il est tout à fait possible de mettre à la fois la cartographie ODM et ORM sur exactement la même classe.

Le problème dépendra peut-être de la synchronisation des données entre ces deux backends de persistance et l'API Entity. Par exemple, si vous avez une association ManyToOne, ODM aura une référence de mémoire interne différente de celle d'ORM. Il est donc possible qu'il écrase les objets avec lesquels vous travailliez.

0

N'avez-vous pas essayé cela auparavant, mais si je peux suggérer quelque chose est d'avoir un mappage différent en xml/yml pour votre classe entity/document?

0

Oui, vous pouvez. Je l'ai fait en utilisant symfony et les annotations, donc je suppose que vous pouvez gérer aussi bien en utilisant l'environnement que vous utilisez.

D'abord, j'ai ajouté deux annotations sur l'entité:

<?php 
use Doctrine\ORM\Mapping as ORM; 
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM; 

/** 
* User 
* 
* @ORM\Entity 
* @ODM\Document 
*/ 
class User 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ODM\Field() 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="email", type="string", length=200, nullable=false) 
    * @ODM\Field() 
    */ 
    private $email; 
} 

Sous symfony le répertoire par défaut pour ORM est le répertoire Entité, pour ODM le répertoire par défaut est le document. Donc, si vous avez une entité qui doit être un document en même temps, vous devez configurer l'un des deux mappages manuellement.

doctrine_mongodb: 
    document_managers: 
     default: 
      mappings: 
       # Default mapping for the bundle (loads Document/) 
       DemoBundle: ~ 
       # Extra mapping to load document mappings under Entity/ 
       DualMappingHack: 
        type: annotation 
        dir: %kernel.root_dir%/../src/Acme/DemoBundle/Entity 
        prefix: EntityPrefix 
        is_bundle: false 
Questions connexes