【问题标题】:Why merged entities are updated on insert?为什么合并实体在插入时更新?
【发布时间】:2013-05-20 18:53:36
【问题描述】:

当插入一个实体时,比如说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

如果用户有更多的 OneToMany 关系,它们中的每一个也会更新。知道用户实体没有改变我不明白为什么Doctrine 正在执行这些更新。 此外,只有创建的(日期时间)对象被更新,其他字段都没有被更新。

我没有级联设置,因此它不应该触发 Article persist() 上的任何内容。

有人吗?

【问题讨论】:

    标签: php symfony doctrine-orm entity symfony-2.1


    【解决方案1】:

    您对 created_at 列的注释是什么?你的 User 类或 BaseUser 中是否有 @PreUpdate 注释(如果它正在扩展)?

    还有;尝试相同的方法,但不使用 $em->merge($user)。我从未使用过它,我什至不知道它的用途,但这可能是问题所在。

    【讨论】:

    • 用户或文章中没有生命周期或 preUpdate 方法。创建字段的注释是基本的@ORM\Column(name="created", type="datetime", nullable=false)。我必须使用合并,因为用户实体存储在缓存中,并且 entityManager 需要在关联完成之前知道它。
    猜你喜欢
    • 1970-01-01
    • 2012-07-29
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    相关资源
    最近更新 更多