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,具有配有开始和结束的有效时间和属性值的表).
真正的问题是,这里我们有多个属性.
我有一个解决方案,但目前尚不清楚,我想听听你的想法.
你的项目让我想起了Hibernate Envers.
Envers项目旨在简化审计持久性类.您需要做的就是使用@Audited注释要审核的持久类或其某些属性.对于每个经审计的实体,将创建一个表,该表将保存对实体所做更改的历史记录.然后,您可以轻松地检索和查询历史数据.
使用Hibernate Envers来解耦实体和修订数据(在数据库和代码中).
您只需向域类添加版本号即可完成类似的操作。我做了类似的事情,其中 Id 是数据库分配的编号和版本号之间的组合,但我建议不要这样做。使用普通的代理键,如果您确实需要,请将 [id, version] 元组设置为自然键。
实际上,您可以通过这种方式对整个对象图进行版本控制,只需确保图上所有元素的版本号相同即可。然后您可以轻松返回到任何以前的版本。
您应该编写大量服务测试以确保管理版本的代码的完整性。