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

时间:2012-08-16 11:14:35

标签: php doctrine-orm

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

当我想坚持一个新的人到数据库中,我创建了一个Person对象,并尝试将其设置的部门属性设置为一个现有系是由实体管理器管理的对象。但是,当我试图坚持我的新人时,我得到一个例外:

  

通过这种关系找到了一个新的实体   “实体\人员#部门”未配置为级联   坚持实体运营:   实体\部@ 0000000016abe202000000000d29dd37。要解决这个问题   问题:在此未知上显式调用EntityManager#persist()   实体或配置级联在映射中保持此关联   例如@ManyToOne(..,cascade = {“persist”})。

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

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

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

元数据:

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();

1 个答案:

答案 0 :(得分:11)

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

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