原则 2 坚持在 ManyToOne 关系中保留已经管理的实体


Doctrine 2 insists on persisting already managed entity in ManyToOne relationship

>我有一个包含部门的数据库表。我还有一张桌子,里面有人。正如您所期望的那样,一个部门包含许多人,而一个人在一个部门中。

当我想将新人员保存到数据库时,我创建一个 Person 对象并尝试将其 Department 属性设置为由实体管理器管理的现有 Department 对象。但是,当我尝试保留我的新人时,我得到一个异常:

通过关系找到了新实体 未配置为级联的"实体''人员#部门" 实体的持久化操作: 实体''Department@0000000016abe202000000000d29dd37.为了解决这个问题 问题:要么在这个未知上显式调用实体管理器#persist() 实体或配置级联 在映射中保留此关联 例如@ManyToOne(..,cascade={"persist"})。

我不完全理解异常中说该部门是"未知实体"的部分,因为我通过实体管理器提取了它。

正如异常所暗示的那样,我在 yml 元数据中插入了一个级联 ( cascade: ["persist"] )。然后我的人被保存了,但我最终在部门表中有一个重复的部门,带有一个新 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();

此问题是由于使用实体管理器的不同实例首先获取部门,然后保留人员引起的。

我的实体管理器现在是一个单一实例,因此无论哪个类请求实体管理器,都会获得相同的实例。