实体在数据库中更新而不调用persist()

时间:2014-08-15 09:59:59

标签: validation symfony doctrine-orm

我发现了一个奇怪的问题。我向我的实体添加了一些约束,发现数据库已更新,尽管约束失败并显示错误消息。

所以可以肯定的是,实体没有在控制器中传递persist()或flush()方法。

该问题仅出现在我之前从数据库加载的实体上,而不是新实例。

是否有一些自动保存或什么?有些听众会与其他实体打交道,他们可能会调用flush(),但为什么这对我的非持久化实体有效?

这是我的测试动作。经理只包括错误处理和访问控制,没有更多的魔力。

public function testAction()
{
    $object = $this->get('object.manager')->load(42);
    $object->setName('Test Autosave 2')
         ->setLabel('Test Autosave 2');

    return array();
}

任何想法是什么导致了这个问题?

2 个答案:

答案 0 :(得分:0)

如果在任何其他地方调用flush方法,则将自动保存从数据库获取的实体(不包含persist)。如果明确调用方法persist,新实体将无法保存。

您可以阅读doc

  

请注意,调用$ em-> persist(...)是不必要的。召回   这种方法只是告诉Doctrine管理或者观察"该   ......对象在这种情况下,因为您获取了...对象   来自Doctrine,它已经被管理了。

答案 1 :(得分:0)

  

实体与EntityManager分离,因此不再通过在其上调用EntityManager#detach($ entity)方法或通过将分离操作级联到它来进行管理。对分离的实体所做的更改(如果有的话)(包括删除实体)将在分离实体后不会同步到数据库。

http://docs.doctrine-project.org/en/2.0.x/reference/working-with-objects.html#detaching-entities

我认为您应该将您的实体与经理分开,以便在编辑时不会更新。