使用Java和Hibernate存储历史数据

cda*_*win 5 java database design-patterns hibernate class-design

这是关于历史数据处理的问题.假设您有一个MyClass类,如下所示:

class MyClass {
    String field1;
    Integer field2;
    Long field3;

    getField1() {...}
    setField1(String ...) {...}

    ...
}
Run Code Online (Sandbox Code Playgroud)

现在,假设我需要让MyClass能够存储和检索旧数据,最好的方法是什么?
要求是坚持通过Hibernate的类了.并且每个"实体"最多只有两个表:"连续性"类只有一个表或一个表(表示随时间演变的实体的表)和另一个历史数据表(如此处所示)
请注意,我必须能够为字段的值分配任意有效时间.

该类应具有如下界面:

class MyClass {
    // how to store the fields????

    getField1At(Instant i) {...}
    setField1At(Instant i, String ...) {...}

    ...
}
Run Code Online (Sandbox Code Playgroud)

我目前使用的JTemporal库,它有一个TemporalAttribute<T>类,它就像一个地图:你可以做一些事情,如T myAttr.get(Instant i)让myAttr的版本在一瞬间,我.我知道如何与Hibernate表坚持一个TemporalAttribute(很简单:我坚持用TemporalAttribute使用的SortedMap,具有配有开始和结束的有效时间和属性值的表).
真正的问题是,这里我们有多个属性.
我有一个解决方案,但目前尚不清楚,我想听听你的想法.

Bri*_*zel 5

你的项目让我想起了Hibernate Envers.

Envers项目旨在简化审计持久性类.您需要做的就是使用@Audited注释要审核的持久类或其某些属性.对于每个经审计的实体,将创建一个表,该表将保存对实体所做更改的历史记录.然后,您可以轻松地检索和查询历史数据.

  • 选择要审核的内容(基于每个属性)
  • 制作您自己的修订实体(存储修订号,作者,时间戳......等信息)

使用Hibernate Envers来解耦实体和修订数据(在数据库和代码中).


hvg*_*des 0

您只需向域类添加版本号即可完成类似的操作。我做了类似的事情,其中​​ Id 是数据库分配的编号和版本号之间的组合,但我建议不要这样做。使用普通的代理键,如果您确实需要,请将 [id, version] 元组设置为自然键。

实际上,您可以通过这种方式对整个对象图进行版本控制,只需确保图上所有元素的版本号相同即可。然后您可以轻松返回到任何以前的版本。

您应该编写大量服务测试以确保管理版本的代码的完整性。