Doctrine2 ORM EntityManager获取发生的错误

时间:2014-08-14 09:45:05

标签: error-handling doctrine-orm entitymanager flush

我有一个名为Theme的实体,它的名称不是Id,但应该是索引且唯一的:

/**
 * @Entity @Table(name="themes",
 *                uniqueConstraints={@UniqueConstraint(name="theme_unique",columns={"name"})},
 *                indexes={@Index(name="theme_idx", columns={"name"})})
 */
class Theme {...}

我使用现有名称创建一个新主题。这会导致错误,脚本会停止。 我该如何获取该错误并继续编写脚本?

function CreateTheme($newThemeName) {
    //$theme = $this->FindByThemeName ( $newThemeName );
    //if (! $theme) {
        $theme = new Theme ();
        $theme->setName ( $newThemeName );
        $theme->setIsActive ( false );
        $theme->setIsDefault ( false );
        $this->entityManager->persist ( $theme );
        $this->entityManager->flush ();
        return $theme;
    //} else {
    //  $this->error = "Error in flush was avoided (name not being unique)!";
    //  return null;
    //}

2 个答案:

答案 0 :(得分:1)

尝试/捕获设置并不能真正解决问题:

由于SQL错误,Doctrine \ ORM \ EntityManager已关闭。 EntityManager不能简单地重置(或重新打开)。关于这个主题的链接:

The EntityManager is closed

声明:"最好是避免获得一个封闭的实体经理(这意味着在将数据发送到数据库之前验证您的数据)"

结论:设置UniqueConstraints的注释是无用的:它不会阻止执行语法有效的SQL指令,该指令会给出"重复的条目"由于该约束导致的SQL错误。 此错误会关闭无法安全重置的EntityManager .... 您需要手动检查是否存在违反独特约束的行为'在尝试持久化并刷新新实体实例之前。

答案 1 :(得分:0)

尝试Catch没有工作,这是这个问题的原因。

ORMException的处理程序以某种方式未注册,现在就是。不清楚是什么造成的。

function CreateTheme($themeName) {
    global $entityManager;
    $theme = new Theme ();
    $theme->setName ( $themeName );
    $theme->setIsActive ( false );
    $theme->setIsDefault ( false );
    try {
        $entityManager->persist ( $theme );
        $entityManager->flush ();
    } catch (Exception $e) {
        echo $e->getMessage();
        $theme = null;
    }
    return $theme;
}

当使用重复的名称时给出:

  

SQLSTATE [23000]:完整性约束违规:1062关键'theme_unique'重复输入'test'