>我有一个包含部门的数据库表。我还有一张桌子,里面有人。正如您所期望的那样,一个部门包含许多人,而一个人在一个部门中。
当我想将新人员保存到数据库时,我创建一个 Person 对象并尝试将其 Department 属性设置为由实体管理器管理的现有 Department 对象。但是,当我尝试保留我的新人时,我得到一个异常:
通过关系找到了新实体 未配置为级联的"实体\人员#部门" 实体的持久化操作: 实体\Department@0000000016abe202000000000d29dd37.为了解决这个问题 问题:要么在这个未知上显式调用实体管理器#persist() 实体或配置级联 在映射中保留此关联 例如@ManyToOne(..,cascade={"persist"})。
我不完全理解异常中说该部门是"未知实体"的部分,因为我通过实体管理器提取了它。
正如异常所暗示的那样,我在 yml 元数据中插入了一个级联 ( cascade: ["persist"]
)。然后我的人被保存了,但我最终在部门表中有一个重复的部门,带有一个新 ID。
这一定是一个非常常见的用例。我在下面包含了我的代码和元数据。我应该进行哪些更改?
元数据:
EntitiesPerson
type: entity
table: people
fields:
...
departmentId:
type: integer
unsigned: false
nullable: false
column: department_id
...
manyToOne:
department:
targetEntity: EntitiesDepartment
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();
此问题是由于使用实体管理器的不同实例首先获取部门,然后保留人员引起的。
我的实体管理器现在是一个单一实例,因此无论哪个类请求实体管理器,都会获得相同的实例。