为什么合并的实体在插入时更新


Why merged entities are updated on insert?

插入实体时,设为article:

Article::id
Article::text
Article::author -> User

文章有作者(ManyToOne)

User::id
User::name
User::created

如果我使用实体管理器在数据库中获取用户:

$user = $em->find(1);
$article = new Article();
$article->text = "balh blah";
$article->user = $user;
$em->persist($article);
$em->flush();

我只有一个插入到数据库这是正确的。

INSERT INTO Article ...

现在,如果我使用存储在会话(或缓存)中的用户:

$user = $cache->find(1);
$user = $em->merge($user);
$article = new Article();
$article->text = "balh blah";
$article->user = $user;
$em->persist($article);
$em->flush();

我可以看到mysql中的2个查询:

INSERT INTO Article ...
UPDATE user set created="..." WHERE id = 1

和如果user为更多的OneToMany关系,它们中的每一个也被更新。知道用户实体没有改变,我不明白为什么Doctrine要执行这些更新。此外,只有created (datetime)对象被更新,其他字段都不更新。

我没有级联设置,所以它不应该触发任何Article persist()。

有人知道吗?

您对created_at列的注释是什么?是否有@PreUpdate注释在某个地方在你的用户类或BaseUser如果它是扩展一个?

也;尝试同样的事情,但没有$em->merge($user)。我从来没用过它,我甚至不知道它的用途,但这可能就是问题所在。