2011-10-10 84 views
2

是否可以使用注释将同一类映射到ORM和ODM?Doctrine 2在同一类上的ORM和MongoDB ODM映射

我们正在决定使用什么,所以我们想要做一些性能测量,我们也希望能够轻松地切换持久性映射器。我已经完成了经理统一,现在我想统一课程。现在我有一个单独的名称空间中的每个类的实体和文档的副本,我发现有点多余。

我读过这篇文章http://www.doctrine-project.org/docs/mongodb_odm/1.0/en/cookbook/mapping-classes-to-orm-and-odm.html,但最终我猜他们使用了两个不同的类,每个类都在它们自己的命名空间中。

有没有人试过这个?

回答

0

我从来没有尝试过,但是完全可以将ODM和ORM映射放在同一个类上。

该问题可能依赖于这两个持久性后端 与实体API之间的数据同步。例如,如果您有一个ManyToOne关联,则ODM在内存引用中的内部位置与ORM的内部位置不同。所以它可能会覆盖你正在使用的对象。

0

以前没有尝试过,但如果我能建议的东西是有不同的映射在xml/yml为您的实体/文档类?

0

是的,你可以。我使用symfony和annotations来完成它,所以我想你可以使用你使用的任何环境来管理。

首先,我添加的实体都注释:

<?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; 
} 

在symfony的ORM的默认目录为实体目录,ODM的默认目录是文件。因此,如果您的实体必须同时是文档,则必须手动配置两个映射中的任何一个。

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