2012-02-17 108 views
0

编辑:问题从不同的包实体使用不同的实体管理器

我准备这一次解压缩并运行./bin/vendors后安装一个tar.gz无法通过PHP脚本/ createAll加载装置。 PHP。在tar.gz中,有两个捆绑使用两个不同的连接,每个人都有自己的数据库。

我认为Symfony2无法正确管理它们。如果你看看scripts/createAll.php将会看到symfony如何加载两个灯具,但是如果你删除了一个随机灯具(这并不重要Var_.php或Foo_.php一切运行良好,这在我看来symfony中未能正确地管理实体)

LINK: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" 

的问题是当使用不同di中的实体之间的关系时累托石,我得到以下因素导致错误的vendor/doctrine/lib/Doctrine/ORM/Mapping/MappingException.php at line 142

Class FRJPC\SalleUrlFormacionsBundle\Entity\EspecialitatContingut is not a valid entity or mapped super class

的probem是,有时“\”供应商名称之前中断的命名空间。这真的很奇怪。

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

 


namespace myVendor\myBundleFooBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity(repositoryClass="myVendor\myBundleFooBundle\Repository\ARepository") 
* @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") 
* @ORM\Table(name="a") 
*/ 
class A 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer", length="4") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="\myVendor\myBundleFooBarBundle\Entity\B", inversedBy="a", cascade={"persist"}) 
    * @ORM\JoinColumn(name="FooBar", nullable=true, referencedColumnName="FooBar", onDelete="CASCADE") 
    */ 
    private $fooBar; 
} 

二实体:

 

namespace myVendor\myBundleFooBarBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity(repositoryClass="myVendor\myBundleFooBarBundle\Repository\ARepository") 
* @ORM\ChangeTrackingPolicy("DEFERRED_EXPLICIT") 
* @ORM\Table(name="a") 
*/ 
class B 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer", length="4") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

     /** @ORM\OneToMany(targetEntity="\myVendor\myBundleFooBundle\Entity\EspecialitatContingut", mappedBy="fooBar") */ 
     private $a; 
} 

没有任何一个对我应该怎么每个实体链接线索?

PD:两个实体在相同的包和相同的目录中时都像魅力一样工作。

回答

3

所有这些Foos和Bars结合一个带有真实姓名的错误信息使其有点难以遵循,并且使得发布的代码实际上与实际代码不匹配的可能性变得有些困难。 FooBarBundle/View似乎不太适合存储实体。

无论如何,像formacions这样的特定实体经理需要能够看到所有相关实体,包括那些涉及到关系的实体。它看起来像你在foo包中定义了A和在条包中定义了B,并且它们都相互交叉引用?

从您的配置中,我看不到formacion em如何看到您的A实体,同样我也看不到默认em可以看到B实体。关系中的全限定类名不足以共享实体原则元数据。因此错误信息。

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

+0

非常感谢您的回答。据我了解,在confyg.yml中,我定义了不同的实体管理器,这些实体管理器由不同的bundle使用,并且只有在关系中使用FQDN时才相互了解,这种概念是否错误?我要上传一个测试案例,所以如果你有时间的话,你可以看看它。非常感谢您的时间,我真的很关心如何解决这个问题。 – user846226 2012-02-18 09:09:37

+0

你可能想看看这个:http://stackoverflow.com/q/9311485/1146363命令:app/console doctrine:mapping:info --em EntityManagerName可以给你一些关于到底给定实体管理器可以看到。 – Cerad 2012-02-18 17:04:57

+0

非常感谢您的回答。我确实知道pp/console主义:mapping:info --em ='foo'命令,但不知道它如何提供帮助。我认为symfony在管理多个连接时存在一些问题,因为实体很好,也有固定装置,并且只有一个固定装置存在时它们可以毫无问题地加载。 – user846226 2012-02-19 13:17:14