因此,在使用 Doctrine2 违反完整性约束后,EntityManager 喜欢以一种无法继续使用所述 EntityManager 的方式关闭。普遍的想法似乎是您应该创建一个新的 EntityManager,而不是被允许捕获这个简单的异常并以优雅的方式处理它(伙计们/讽刺的美妙设计)。
但是,当使用带有封闭实体管理器的 Bisna 库/ZF 1.12 时会出现问题。 Bisna 库不提供在 Container 类中关闭后创建具有相同名称(即“默认”)的新 EntityManager 的公共(public)方法。
我的问题是处理此问题的最佳方法是什么。在违反完整性约束后,必须有一种从容恢复的方法。
最佳答案
与其尝试从这些情况中恢复,不如专注于防止违反完整性约束:
- 如果您遇到外键约束,则说明您没有以正确的方式将实体捆绑在一起。
- 如果您遇到唯一约束,您应该在尝试持久化数据之前检查数据库中是否存在可能的重复数据。
- 如果您遇到其他类型的约束并且不知道如何防止它,请询问:)
更新:
Doctrine2 关闭 EntityManager 的原因是因为在大多数情况下使用它不再安全。它的 UnitOfWork 包含无法完成的操作(因此抛出异常)。
您说得对,Bisna 库不支持创建新的 EntityManager。您可以扩展它以便自己实现此类功能。
另一种解决方案是 handle transactions manually :
$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,因为其中的数据(几乎总是)不再可用。
关于php - 使用 Bisna/Doctrine2 处理关闭的 EntityManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12274736/