原则两次保存实体

时间:2019-08-27 09:03:42

标签: symfony doctrine-orm doctrine symfony4

Iam使用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;

2 个答案:

答案 0 :(得分:1)

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

您的问题表明createdBy字段只能包含与现有用户的关系。这意味着cascade在这里绝对不是必需的。这也是现有实体在您的案例中再次保留的原因。

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

之后清除缓存。

答案 1 :(得分:0)

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

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