与其试图从这些情况中恢复,不如专注于防止违反完整性约束:
- 如果您遇到外键约束,您就没有以正确的方式将实体绑定在一起。
- 如果遇到唯一约束,则应在尝试持久化之前检查数据库是否存在重复数据。
- 如果您遇到其他类型的约束并且不知道如何防止它,请询问:)
更新:
Doctrine2 关闭 EntityManager 的原因是因为在大多数情况下它不再安全使用。它的 UnitOfWork 包含无法完成的操作(因此引发异常)。
您是正确的,Bisna 库不支持创建新的 EntityManager。您可以扩展它以自己实现此类功能。
另一种解决方案是手动处理事务:
$em->getConnection()->beginTransaction(); // suspend auto-commit
try {
// do some work
$user = new User;
$user->setName('George');
$em->persist($user);
$em->flush();
$em->getConnection()->commit();
} catch (Exception $e) {
$em->getConnection()->rollback();
$em->clear(); // in stead of $em->close();
throw $e;
}
通过替换$em->close()
为$em->clear()
您保持 EntityManager 打开并清洁以再次使用。
我强烈建议您关闭或清除EntityManager ,因为其中的数据(几乎总是)不再可用。