1

特定のハッシュを作成しようとしています。次のパスがたどられます。

  1. $hash に一意のキーを持つハッシュ オブジェクトを作成します
  2. コンストラクターはシードを埋めて実際の $hash を生成します
  3. 保存してみてください
  4. エラー 23000 (重複キー) のために保存に失敗した場合は、別のハッシュを作成し、まだ存在しない一意のハッシュが作成されるまで繰り返します。

ここに私の問題があります。Doctrine2 を使用して、SQL エラーが原因でクエリが失敗したときに EntityManager を閉じます。私の場合、再試行するので問題ありません。

1 つの解決策は、ハッシュが既に存在する場合にデータベースを検索することです。衝突 (md5) の量が非常に少なく、可能な限り高速に実行する必要があるため (節約できるミリ秒ごとに価値があります)、チェックをスキップしたいと思います。

私が試してみる価値があると思ったもう 1 つの解決策はclone、エンティティ マネージャーに対するものでした。ただし、内部でエンティティ マネージャーは既に内部のオブジェクトに渡されており、それらは複製されずに参照と共に渡されます。

3 番目の解決策は、レジストリを使用して新しいエンティティ マネージャーを作成することです。ただし、このオブジェクトの外では、適切なエンティティ マネージャーはありません。

  • オブジェクト A が EM を取得 -> クエリを実行
  • オブジェクト B が EM を取得 -> クエリを実行 > エラー > 新しい EM を作成
  • オブジェクト C が EM を取得 -> 新しい EM でクエリを実行
  • オブジェクト A > クエリを実行 > エラー、ステップ 1 で既に取得しているため、既に閉じられています。

すぐに挿入できるようにするにはどうすればよいですか? エンティティを介して行う必要があります。フラットな DQL/SQL クエリを作成するつもりはありません。

4

1 に答える 1

0

永続化する前に一意のハッシュを見つけるのはどうですか?

do {
    $unique_hash = md5(microtime()); // Work out your hash here.
    $existing = $repository->findOneByHash($unique_hash);
    if (!$existing) {
        break; // else carry on until we get one.
    }
} while (1);

// Use your unique hash here.
于 2013-07-25T12:26:42.190 に答える