【问题标题】:EntityManager is closed by unique key violationEntityManager 因唯一键违规而关闭
【发布时间】:2017-08-03 10:36:04
【问题描述】:

我的应用程序使用 Doctrine2 EntityManager。在一个循环中,我喜欢将 5 个数据集插入到不同的表中。

public function insertRate($dateObj, $rate)
{       
    $model = new TestModel();

    $model
        ->setDate($dateObj)
        ->setRate($rate);

    $this->getEntityManager()->persist($model);

    try {
        $this->getEntityManager()->flush();
    } catch (\Exception $e) {
        $currentTime = new \DateTime();
        echo 'Duplicate entry <br>' .
            'At Time ' . $currentTime->format('Y-m-d H:i') . "<hr>";
    }
}

如果可能由于重复条目(唯一约束)而导致插入 2 失败,则 entityManger 将不会执行以下 3 条语句,因为管理器已关闭。

我使用这样的解决方法:

$currentEm = $this->em;
if (!$currentEm->isOpen()) {
    $this->em = $currentEm->create(
        $currentEm->getConnection(), $currentEm->getConfiguration());
}

使用此解决方法,将设置一个新的 entityManger,但 auto_increment id 不像 1、2、3... 而是 1、5、10、15...

我不想检查是否会因为额外的选择而违反唯一约束。

我该如何解决这个问题,这个解决方法可以吗?

【问题讨论】:

  • 你能告诉我们插入数据的代码吗?
  • 无论如何,依赖异常最终都会咬你一口。进行查询并完成它。
  • 失败插入时自动增量的差距是由数据库引擎的设计决定的。这里是many questions about it

标签: php doctrine-orm


【解决方案1】:

事务失败后,您的 EntityManager 会被锁定——这是预期的行为。你可以reset it通过:

$this->getDoctrine()->resetManager();

【讨论】:

  • 不会帮助解决 auto-inc 问题,反正有点傻。
  • @Cerad 我想自动增量是由数据库处理的,所以它的问题与 Doctrine EntityManager 无关。
  • @Cerad 同样,使用int 作为主键并不总是good choice
  • getDoctrine() 在我的上下文中不可用。我怎样才能访问它?
  • @jkucharovic 我同意。这就是为什么我称之为愚蠢的要求。
猜你喜欢
  • 2022-07-22
  • 2015-11-05
  • 2017-04-28
  • 1970-01-01
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
相关资源
最近更新 更多