php – Doctrine 2坚持在ManyToOne关系中保持已经管理的实体

我有一个包含部门的数据库表.我有另一个包含人的表.正如您所期望的那样,某个部门包含许多人,并且某个人在一个部门中.

当我想将新人保留到数据库时,我创建一个Person对象并尝试将其Department属性设置为由Entity Manager管理的现有Department对象.但是,当我尝试坚持我的新Person时,我得到一个例外:

A new entity was found through the relationship
‘Entities\Person#department’ that was not configured to cascade
persist operations for entity:
Entities\Department@0000000016abe202000000000d29dd37. To solve this
issue: Either explicitly call EntityManager#persist() on this unknown
entity or configure cascade persist this association in the mapping
for example @ManyToOne(..,cascade={“persist”}).

我并不完全理解异常部分,该部门称该部门是一个“未知实体”,因为我是通过实体经理提取的.

如异常所示,我在yml元数据中插入了一个级联(cascade:[“persist”]).我的人然后得到了保存,但我最终在department表中有了一个重复的部门,并带有一个新的id.

这必须是一个非常常见的用例.我在下面提供了我的代码和元数据.我应该做些什么改变?

元数据:

Entities\Person
  type: entity
  table: people
  fields:
    ...
    departmentId:
      type: integer
      unsigned: false
      nullable: false
      column: department_id
    ...
  manyToOne:
    department:
      targetEntity: Entities\Department
      joinColumn: department_id
      referenceColumnName: id

码:

$department = $em->getRepository('Department')->findOneBy(array('name' => $departmentName);

$person = new Person();
$person->setName('Joe Bloggs');
$person->setDepartment($department);

$em->persist($person);
$em->flush();
问题是由使用实体管理器的不同实例首先获取部门,然后持久保存Person.

我的实体管理器现在是一个单例,所以无论哪个类请求实体管理器获取相同的实例.

相关文章

Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...
初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...
边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....
在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...