是否可以使用注释将同一个类映射到ORM和ODM ?
我们正在决定使用什么,所以我们想要做一些性能测量,我们也希望能够轻松地切换持久化映射器。我已经统一了经理,现在我想统一类。现在我在实体和文档的单独命名空间中有每个类的副本,我觉得有点多余。
我读了这篇文章http://www.doctrine-project.org/docs/mongodb_odm/1.0/en/cookbook/mapping-classes-to-orm-and-odm.html,但最后我猜他们使用了两个不同的类,每个类都在自己的命名空间中。
有人试过吗?
我从未尝试过,但完全有可能将ODM和ORM映射放在完全相同的类上。
问题可能依赖于这两个持久化后端之间的数据同步和实体API。例如,如果您有一个ManyToOne关联,ODM将有一个不同于ORM的内部内存引用。所以它有可能会覆盖你正在使用的对象。
之前没有尝试过,但如果我能建议一些东西是在xml/yml中为您的实体/文档类有不同的映射?
可以。我已经使用symfony和注释完成了它,所以我想你可以使用任何你正在使用的环境来管理它。
首先,我在实体上添加了两个注释:<?php
use DoctrineORMMapping as ORM;
use DoctrineODMMongoDBMappingAnnotations as ODM;
/**
* User
*
* @ORMEntity
* @ODMDocument
*/
class User
{
/**
* @var integer
*
* @ORMColumn(name="id", type="integer", nullable=false)
* @ORMId
* @ODMField()
*/
private $id;
/**
* @var string
*
* @ORMColumn(name="email", type="string", length=200, nullable=false)
* @ODMField()
*/
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