【发布时间】:2018-09-05 12:26:54
【问题描述】:
我的应用程序使用 Hibernate-Envers 4.3.11
- 我将音乐文件加载到我的数据库中,并将它们的元数据(例如专辑标题、艺术家)表示为经过审核的 Song 类
- 然后应用程序以各种方式编辑元数据,并写回 Song 类(每次提交的会话都会创建另一个修订版)
- 然后通常在最后将更改从当前 Song 类写回文件本身。
- 但如果在预览模式下运行,则不会将任何内容写入文件。因此,我希望该文件的 Song 类的最新版本现在包含与最初加载文件时创建的版本相同的元数据。
目前,我通过获取 Song 的第一个修订版并将其保存的数据复制到 Song 的最新版本来做到这一点。 但有没有一种方法可以让我将这个较早的版本改为最新版本。
更新
我现在正在执行 Naros 的答案。所以现在我有一个名为 SongFile 的类,它始终代表磁盘上音乐文件的内容,这是 @Audited(由 Envers 提供),主 ID 是 @GeneratedValue。
然后我们有一个名为Song的类,在创建并省略了一个SongFile实体之后,我们创建了一个等效的Song实体。这个没有审核,primary id是手动设置的,我们设置primaryId和所有的元数据和Song类一样。
然后应用将元数据修改为歌曲。
最后,如果在预览模式,我们只是比较Song和SongFile之间的差异并生成报告。
如果在 Real save 模式下,我们比较 Song 和 SongFile 之间的差异并生成报告并将更改保存回文件,并且 歌曲文件。
效果很好,解决了很多问题。
但是我有一个问题,音乐文件也可以存储多个图像(jpeg 等),我们使用一个表示图像的 CoverImage 类和一个表示图像的 CoverArt 类对其进行建模在 Song 和 CoverImage 之间提供 1:M 链接,还存储了一个名称属性。
现在的问题是我创建了一个 SongFile 使用的 CoverArtFile 类,它使用了@GeneratedValue 和一个 CoverArt 类不会自动生成的歌曲。
最初加载文件并创建 SongFile 和 Song 时,这可以正常工作,将自动生成的值从任何 CoverArtFile 类复制到 CoverArt 班级
但是,如果我们没有开始的封面,然后它被应用程序添加,我们会失败,因为 CoverArt 类不会自动生成主键,我无法安全地生成一个以防万一它被使用通过现有的 CoverArtFile 类(或将在未来)。
如果我让 CoverArt 使用自动生成的值,那么它不会与关联的 CoverArtFile 类使用的值相同。
我该如何进行?
【问题讨论】:
-
所以在预览模式下,即使不需要这些更改,您也允许事务提交到数据库?
-
这些更改是(可能)需要的,但只写入数据库而不是文件本身,这样我们就可以创建一个报告,显示如果不在预览模式下运行可能对文件进行的更改.
-
那么@Naros 有什么想法吗?
标签: java hibernate hibernate-envers