Doctrine 两次保存实体

Doctrine saves entities twice

我正在使用 Symfony(4.3) 和 Doctrine。当我想在脚本的构造函数中获得这样的用户时:

$userRepo = $this->em->getRepository(User::class);
    $this->systemUser = $userRepo->findOneBy([
        "firstName" => "system",
        "lastName" => "system",
    ]);

并保存对该用户的引用,例如在 createdBy 字段中,如下所示:

$newUser->setName("test");
$newUser->setCreatedBy($this->systemUser);
$this->entityManager->persist($newUser);
$this->entityManager->flush();

systemUser 会在每个 flush() 之后持久保存到数据库中。

我已经尝试只获取

的参考
$this->systemUser = $this->entityManager->getReference(User::class, $this->systemUser->getId());

但这也不行。

编辑: setCreatedBy-方法:

public function setCreatedBy(User $user): void {
    $this->createdBy = $user;
}

'createdBy'-字段:

/**
* @var User
* @ORM\ManyToOne(targetEntity="App\Entity\User", cascade={"persist"})
* @ORM\JoinColumn(nullable=true)
*/
protected $createdBy;

您已经为关系配置了 cascade={"persist"} 选项,这意味着 Doctrine 将保存通过关系找到的 "new" 个实体。

正如您的问题所暗示的那样,createdBy 字段只能包含与现有用户的关系。这意味着 cascade 在这里绝对没有必要。这也是在您的案例中再次保留现有实体的原因。

从 属性 的映射配置中删除 cascade 选项以解决您的问题。

之后清除缓存。

回答我自己的问题: 我忘了提到我在一个循环中插入了 ~ 70.000 个项目,并且每 100 行使用 clear()。问题是实体管理器的 clear() 方法的使用。它分离所有学说管理的实体,因此学说认为这些实体是新的并将它们保存到数据库中。所以我必须这样做:

$newUser->setCreatedBy($this->em->getReference(User::class, $this->systemUser->getId()));