共享Doctrine EntityManager服务

时间:2017-04-12 07:39:31

标签: doctrine-orm

我们正在将Symfony用于我们的项目,并且有一些关于我无法继续使用的Doctrine。 Doctrine的实体管理器(以下称为'em')是一种共享服务,因此当我将em注入多个服务时,它们共享完全相同的em实例。它更简单如果我立即介绍一个例子来解释我想问的问题:考虑下面的例子:

$service1 = $this->get('vendor_test.service_one'); // $service1 has a private entity manager property
$service2 = $this->get('vendor_test.service_two'); // $service2 as well has a private entity manager property

$entity1 = $service1->getEntityById(1); // getEntityById() queries for an entity with the given id and returns it. So it is in the managed list of service1's entity manager
$entity2 = $service2->getEntityById(2); // entity1 and entity2 not necessarily of the same class

$entity1
   ->setProperty1('aaaa')
   ->setProperty2($service2->updateDateTime($entity2))  // updateDateTime() let's say updates a datetime field of the passed entity (in this case entity2) and calls $this->entityManager->flush(); and returns the datetime.
   ->setProperty3('bbbb')

$service1->save();  // calls $this->entityManager->flush() so it should update the managed entities (in this case entity1)

所以问题是:如果service1和service2的entityManager对象是entityManager的同一实例,因此它们是相同的,它们共享相同的内部托管列表,然后在调用$service2->updateDateTime($entity2)时执行entityManager->flush() ,它是否也会刷新$ entity1?将property1设置为'aaaa'的$ entity1中途刷新并在数据库中更新,并在$ service1-> save()时在第二步刷新被称为?

希望我设法制定我的意思和我想要的内容。

1 个答案:

答案 0 :(得分:0)

当我测试并询问更有能力的人时,答案是肯定的,因为我使用实体管理器的所有地方都共享相同的管理列表。要克服问题中提到的问题,就是将要刷新的实体传递给实体管理器,所有其他实体将完好无损。