【问题标题】:Doctrine 2 ORM and MongoDB ODM mapping on the same class同一类上的 Doctrine 2 ORM 和 MongoDB ODM 映射
【发布时间】:2011-12-04 08:50:31
【问题描述】:

是否可以使用注解将同一个类同时映射到 ORM 和 ODM?

我们正在决定使用什么,因此我们想要进行一些性能测量,并且我们还希望能够轻松切换持久性映射器。我已经做了经理统一,现在我想统一班级。现在我在实体和文档的单独命名空间中拥有每个类的副本,我觉得这有点多余。

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

有人试过吗?

【问题讨论】:

    标签: orm mongodb doctrine-orm odm


    【解决方案1】:

    我从未尝试过,但完全可以将 ODM 和 ORM 映射放在完全相同的类上。

    问题可能取决于这两个持久性后端之间的数据同步 和实体 API。例如,如果您有一个 ManyToOne 关联,ODM 将具有与 ORM 不同的内部内存引用。因此它可能会覆盖您正在使用的对象。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        是的,你可以。我已经使用 symfony 和注释完成了它,所以我想你可以使用你正在使用的任何环境来管理。

        首先,我在实体上添加了两个注释:

        <?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 的默认目录是 Entity 目录,而 ODM 的默认目录是 Document。因此,如果您有一个必须同时是文档的实体,则必须手动配置这两个映射中的任何一个。

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-08
          • 2015-04-10
          • 1970-01-01
          • 2015-07-01
          • 2017-08-13
          • 1970-01-01
          相关资源
          最近更新 更多