使用不同实体管理器的不同捆绑包中的实体中的问题

Posted

技术标签:

【中文标题】使用不同实体管理器的不同捆绑包中的实体中的问题【英文标题】:Issues in entities from different bundles using different entity managers 【发布时间】:2012-03-08 22:58:20 【问题描述】:

编辑:

我准备了一个 tar.gz,它一旦解压缩并且在运行 ./bin/vendors install 后无法通过 php scripts/createAll.php 加载固定装置。在 tar.gz 中有 2 个包使用 2 个不同的连接,每个人都有自己的数据库。

我认为 Symfony2 无法正确管理它们。如果你看一下 scripts/createAll.php 会看到 symfony 如何无法加载两个夹具,但是如果你删除一个随机夹具(不管 Var_.php 或 Foo_.php 一切运行正常,在我看来, symfony 无法正确管理实体。)

链接:http://www.2shared.com/file/2u4GhFVX/SymfonyTestCasetar.html

我想告诉Symfony2 对不同的entity managers 使用不同的Bundle directories,所以我的config.yml 看起来像:

orm:
    auto_generate_proxy_classes: %kernel.debug%
    default_entity_manager:   default
    entity_managers:
        default:
            connection: default
            mappings:
                myVendorURLCoreBundle: ~
                myVendormyBundleBundle: ~
                myVendormyBundleFooBundle:
                    prefix: "myVendor\myBundleFooBundle\Entity"
                    type: annotation
                    is_bundle: true
                    dir: "/Entity"
        formacions:
            connection: formacions
            mappings:
                myVendormyBundleFooBarBundle:
                    prefix: "myVendor\myBundleFooBarBundle\View"
                    type: annotation
                    is_bundle: false
                    dir: "%kernel.root_dir%/../src/myVendor/myBundleFooBarBundle/View"

问题是当使用不同目录中的实体之间的关系时,我得到由vendor/doctrine/lib/Doctrine/ORM/Mapping/MappingException.php at line 142引起的以下错误

类 FRJPC\SalleUrlFormacionsBundle\Entity\EspecialitatContingut 是 不是有效的实体或映射的超类

问题是有时供应商名称前的“\”会破坏命名空间。这真的很奇怪。

这是我如何在彼此之间链接实体:

命名空间 myVendor\myBundleFooBundle\Entity; 使用 Doctrine\ORM\Mapping 作为 ORM; /** * @ORM\Entity(repositoryClass="myVendor\myBundleFooBundle\Repository\ARepository") * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") * @ORM\Table( name="a" ) */ A级 /** * @ORM\ID * @ORM\Column( type="integer", length="4" ) * @ORM\GeneratedValue( 策略="AUTO" ) */ 私人 $id; /** * @ORM\ManyToOne(targetEntity="\myVendor\myBundleFooBarBundle\Entity\B", inversedBy="a", cascade="persist") * @ORM\JoinColumn( name="FooBar", nullable=true, referencedColumnName="FooBar", onDelete="CASCADE" ) */ 私人 $fooBar;

第二个实体:

命名空间 myVendor\myBundleFooBarBundle\Entity; 使用 Doctrine\ORM\Mapping 作为 ORM; /** * @ORM\Entity(repositoryClass="myVendor\myBundleFooBarBundle\Repository\ARepository") * @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") * @ORM\Table( name="a" ) */ B类 /** * @ORM\ID * @ORM\Column( type="integer", length="4" ) * @ORM\GeneratedValue( 策略="AUTO" ) */ 私人 $id; /** @ORM\OneToMany( targetEntity="\myVendor\myBundleFooBundle\Entity\EspecialitatContingut", mappedBy="fooBar" ) */ 私人 $a;

有没有人知道我应该如何链接每个实体?

PD:当两个实体在同一个包和同一个目录中时,它们的工作方式就像魅力一样。

【问题讨论】:

【参考方案1】:

所有这些 Foos 和 Bars 与带有真实姓名的错误消息相结合,使其有点难以理解,并留下了发布代码与实际代码不匹配的可能性。 FooBarBundle/View 似乎不太可能是存储实体的地方。

在任何情况下,给定的实体管理器(例如 formacions)都需要能够查看所有相关实体,包括关系中涉及的实体。看起来您在 foo 包中定义了 A 并在 bar 包中定义了 B 并且它们都相互交叉引用?

从您的配置中,我看不到 formacion em 如何看到您的 A 实体,同样我看不到默认 em 如何看到 B 实体。关系中的完全限定类名不足以共享实体学说元数据。因此出现错误消息。

我真的很高兴被证明是错误的。不能做这些事情有点令人沮丧。

【讨论】:

非常感谢您的回答。据我了解,在 confyg.yml 中,我定义了不同的实体管理器,它们由不同的捆绑包使用,并且只有在关系中使用 FQDN 时才相互了解,这个概念是错误的吗?我要上传一个测试用例的例子,有时间的可以看看。非常感谢您的宝贵时间,我真的很想知道如何解决这个问题。 您可能想看看这个:***.com/q/9311485/1146363 命令:app/console 学说:mapping:info --em EntityManagerName 可以让您深入了解给定实体管理器可以看到的确切内容。 非常感谢您的回答。我确实知道 pp/console 学说:mapping:info --em='foo' 命令,但不知道它有什么帮助。我认为 symfony 在管理多个连接时存在某种问题,因为实体很好,固定装置也很好,当只有一个固定装置存在时,它们可以毫无问题地加载。

以上是关于使用不同实体管理器的不同捆绑包中的实体中的问题的主要内容,如果未能解决你的问题,请参考以下文章

将分离的实体合并到 JPA 中的实体管理器的最佳方法是啥

使用多个数据源时 Spring 中的多个实体管理器问题

奏鸣曲管理包中的内联可编辑 OneToOne 关系

未显示受奏鸣曲管理中的角色实体块限制

为什么不把实体类交给容器管理

两个实体管理器的 HSQL 死锁