Hibernate 4.0を使用すると、3つのHibernateエンティティがあります。
歌、カバーアート、カバーイメージ
曲は音楽ファイルを表し、CoverImageは画像を表し、CoverArtはCoverImageを曲に関連付けるために使用されます。曲には複数のカバー画像を含めることができます。
SongとCoverArtには、Hibernateによって自動的に生成された主キーがあります。ただし、Cover Imageの主キーは手動で行われ、画像データのMessageDigestとして作成されます。これを行うのは、同じ画像を多くの曲で使用でき、同じ画像の個別のインスタンスをデータベースに複数回保存したくないためです。また、データベースでファイルを確認できるデータからキーを作成できるためです。存在し、存在する場合は、新しいCoverImageを作成するのではなく、それを取得します。
問題は、私のアプリケーションがマルチスレッドであり、Hibernateが実際にデータベースにすぐにコミットしないため、スレッド1は、カバーイメージがデータベースに既に存在するかどうかを確認し、存在しないことを確認して、新しいSong、CoverArt、およびCoverImageオブジェクトを構築する場合があります。しかし、データがデータベースにコミットされるまでに、CoverImageが別のスレッドによって追加された可能性があるため、新しいCoverImageが既存のCoverImageと同じキーを持っているため、例外が発生します。
私は使用しています
session.merge(coverImage);
だから私はそれでこれを処理できると思いましたが、それは役に立たないようです