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()));
我正在使用 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()));