当entityManager执行flush
时,此flush会抛出异常。理论实体管理器将捕获此异常,清除工作单元并将mark the connection
关闭,然后执行回滚(https://github.com/doctrine/doctrine2/blob/v2.5.6/lib/Doctrine/ORM/UnitOfWork.php#L412-L417)。
我需要恢复连接,但由于在entityManager中没有使用$this->closed = false
的方法,我很困惑如何解决这个错误flush
之后我可以flush
另一个实体标记为在数据库中将特定任务标记为失败!此外,当前一个失败时,我无法运行多个任务,而当使用entityManager时,另一个无法运行。
TL; DR 那么在刷新失败后恢复连接的最佳做法是什么?我看到它只是标记为已关闭并仍然连接但我不想使用像Reflection或自定义实体管理器这样的东西来恢复我的连接。
答案 0 :(得分:3)
您可以使用功能resetManager
赞这个$this->getDoctrine()->resetManager()
此link
<强> 修改 强>
让我们假设它的一个表有一个日期字段As DateTime而不是null
$Exemple = new Exemple();
$Exemple->setDate(null);
$em = $this->getDoctrine()->getManager();
try {
$em->persist($Exemple);
$em->flush();
} catch (\Exception $ex) {
$em = $this->getDoctrine()->resetManager();
}
$Exemple->setDate(new \DateTime());
$em->persist($Exemple);
$em->flush();
将$this->getDoctrine()->resetManager();
数据刷入数据库中
如果没有$this->getDoctrine()->resetManager();
,我们会 EntityManager已关闭。
答案 1 :(得分:1)
试试这个,首先,如果它抛出异常,请抓住你的方法,之后,你可以检查连接是否仍然打开,否则,重新定义它。
void Book::setAuthor( std::shared_ptr<Author> t_author)
{
m_author = std::move( t_author );
}
我在使用Symfony2.8的命令中使用了这种方式,它对我来说很正常。