代码之家  ›  专栏  ›  技术社区  ›  Paul Taylor

在Hibernate Envers中,如何使实体的早期版本成为最新版本

  •  0
  • Paul Taylor  · 技术社区  · 6 年前

    我的应用程序使用HibernateEnvers4.3.11

    • 我将音乐文件加载到数据库中,并将其元数据(例如专辑标题、艺术家)表示为已审核的
    • 然后应用程序以各种方式编辑元数据,并写回Song类(每次提交会话时都会创建另一个修订)
    • 通常在最后,更改会从当前的Song类写回到文件本身。
    • 但如果跑进去

    目前,我通过获取第一次修订的Song并将其保存的数据复制到最新版本的Song来实现这一点。 .

    更新

    歌曲文件

    然后我们有一个叫做 ,在 实体被创建和省略我们创建一个等价的

    然后应用程序将元数据修改为 .

    最后,如果 预览模式 ,我们只是比较 歌曲文件

    如果在 真正节省 模式,我们比较 歌曲文件 .

    这很有效 解决了很多问题。

    但是我有一个问题,音乐文件也可以存储多个图像(JPEG等),我们用一个 覆盖件 类,该类在 封面图片

    现在的问题是我创建了一个 使用的类 使用@GeneratedValue和 覆盖件 使用的类 那不会自动生成。

    最初加载文件并创建 歌曲文件 这可以很好地工作,从任何 CoverArtFile 类到 覆盖件

    覆盖件 封面文件 类(或将在将来)。

    或者,如果covertart使用了一个自生值,那么它就不会与它关联的covertartfile类使用的值相同。

    我该怎么做?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Naros    6 年前

    所以最好的办法就是

    1. 从Hibernate获取现有实体。

    另一个可行的想法是考虑将 预览 非预览 . 我的意思是你有两个实体而不是一个 Song . 你有一个代表高电压版本的 预览 另一个是低电压的 非预览

    预览 变体,您只是使用Envers创建了一个更改日志,用于可能对文件进行更改但不是由于 预览模式 应该是 .

    预览 预览 以及 非预览 有相同的内容,所以基本上加载 预览 实体,修改它以匹配 然后再为它保存更改。

    更新

    CoverArt 实体维护对被审计实体的引用,或者至少存储主键值。

    @Entity
    public class Song {
      @Id
      @GeneratedValue
      private Long id;
      @OneToOne
      private SongFile songFile;      
    }
    

    或者更简单

    @Entity
    public class Song {
      @Id
      @GeneratedValue
      private Long id;
      private Long songFileId;
    }
    

    其思想是,非基于文件的实体通过关联(例如。 @OneToOne