Orm 如何放弃对原则2中实体的未刷新更改?

Orm 如何放弃对原则2中实体的未刷新更改?,orm,doctrine,doctrine-orm,Orm,Doctrine,Doctrine Orm,长期以来,我一直使用基于SQL查询的数据库访问级别。但现在我决定使用ORM Doctrine2。目前,我对实体工作流有一个概念上的误解 最好用例子来描述: 试试看{ $user=$entityManager->find('user',1); $user->setName('newname'); $entityManager->flush(); } 捕获(…) { //!我们在这里:更改失败,数据库中的$user行未更新 } // ... $user=$entityManager->find('u

长期以来,我一直使用基于SQL查询的数据库访问级别。但现在我决定使用ORM Doctrine2。目前,我对实体工作流有一个概念上的误解

最好用例子来描述:

试试看{
$user=$entityManager->find('user',1);
$user->setName('newname');
$entityManager->flush();
}
捕获(…)
{
//!我们在这里:更改失败,数据库中的$user行未更新
}
// ...
$user=$entityManager->find('user',1);
$user->setOther('Other');
$entityManager->flush();// 这是故意的

实体管理器确保您总是为给定的id获取相同的实体。毕竟,这就是标识的含义。只能有一个id为1的唯一用户

如果您想从数据库中“刷新”一个实体,我们将为您这样做。从文档中:

刷新数据库中实体的持久状态,覆盖尚未持久化的任何本地更改


您必须执行以下命令:
$entityManager->detach($userEntity)。调用flush后,更改将不会反映在数据库中。其他实体将起作用。

这个答案不是一个好答案:如果任何对象处于
managed
状态(即:
entityManager
处理的是分离的对象,条令会认为分离的对象是一个全新的对象。结果是:如果配置了持久化级联操作,将执行插入。如果没有配置持久化级联操作,将引发错误“找到新实体…”。