使用 Hibernate 4.0 我有三个休眠实体:
歌曲,封面艺术,封面图片
Songs 代表音乐文件,CoverImage 代表一张图片,CoverArt 用于将 CoverImages 与 Songs 关联起来,一首歌曲可以包含多个封面图片。
Song 和 CoverArt 有一个由 Hibernate 自动生成的主键。但是 Cover Image 主键是手动完成的,构造为图像数据的 MessageDigest。我这样做是因为同一张图片可以被很多歌曲使用,我不想在数据库中多次存储同一张图片的单独实例,也因为可以从数据中构造密钥我可以在数据库中检查文件是否已经如果存在,则检索它而不是构造一个新的 CoverImage。
问题是我的应用程序是多线程的,Hibernate 实际上并没有立即将内容提交到数据库,因此线程 1 可能会检查封面图像是否已经在数据库中,发现它不存在并构造一个新的 Song、CoverArt 和 CoverImage 对象。但是当数据被提交到数据库时,一个单独的线程可能已经添加了一个 CoverImage,所以我得到一个异常,因为我的新 CoverImage 具有与现有的相同的键
我正在使用
session.merge(coverImage);
所以我认为这可以解决这个问题,但它似乎没有帮助