8

我有一个包含部门的数据库表。我有另一张桌子,里面有人。正如您所期望的那样,一个部门包含很多人,而一个人属于一个部门。

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

通过关系 'Entities\Person#department' 找到了一个新实体,该关系未配置为实体的级联持久化操作:Entities\Department@0000000016abe202000000000d29dd37。要解决这个问题:要么在这个未知实体上显式调用 EntityManager#persist(),要么配置级联在映射中保持此关联,例如 @ManyToOne(..,cascade={"persist"})。

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

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

1 回答 1

11

该问题是由于使用实体管理器的不同实例首先获取部门,然后持久化人员而引起的。

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

于 2012-08-17T10:34:06.930 回答