特定のハッシュを作成しようとしています。次のパスがたどられます。
- $hash に一意のキーを持つハッシュ オブジェクトを作成します
- コンストラクターはシードを埋めて実際の $hash を生成します
- 保存してみてください
- エラー 23000 (重複キー) のために保存に失敗した場合は、別のハッシュを作成し、まだ存在しない一意のハッシュが作成されるまで繰り返します。
ここに私の問題があります。Doctrine2 を使用して、SQL エラーが原因でクエリが失敗したときに EntityManager を閉じます。私の場合、再試行するので問題ありません。
1 つの解決策は、ハッシュが既に存在する場合にデータベースを検索することです。衝突 (md5) の量が非常に少なく、可能な限り高速に実行する必要があるため (節約できるミリ秒ごとに価値があります)、チェックをスキップしたいと思います。
私が試してみる価値があると思ったもう 1 つの解決策はclone
、エンティティ マネージャーに対するものでした。ただし、内部でエンティティ マネージャーは既に内部のオブジェクトに渡されており、それらは複製されずに参照と共に渡されます。
3 番目の解決策は、レジストリを使用して新しいエンティティ マネージャーを作成することです。ただし、このオブジェクトの外では、適切なエンティティ マネージャーはありません。
- オブジェクト A が EM を取得 -> クエリを実行
- オブジェクト B が EM を取得 -> クエリを実行 > エラー > 新しい EM を作成
- オブジェクト C が EM を取得 -> 新しい EM でクエリを実行
- オブジェクト A > クエリを実行 > エラー、ステップ 1 で既に取得しているため、既に閉じられています。
すぐに挿入できるようにするにはどうすればよいですか? エンティティを介して行う必要があります。フラットな DQL/SQL クエリを作成するつもりはありません。