这是历史数据处理的一个问题。假设您有一个类MyClass,如下所示:
class MyClass {
String field1;
Integer field2;
Long field3;
getField1() {...}
setField1(String ...) {...}
...
}现在,假设我需要使MyClass能够存储和检索旧数据,那么最好的方法是什么呢?
requirements也要通过Hibernate来持久化这些类。,每个“实体”最多有两个表:只有一个表或一个表表示“连续性”类(一个表代表随着时间推移的实体),另一个表用于历史数据(按照这里的建议)
请注意,我必须能够为字段的值分配任意的有效时间。
类应该有一个接口,类似于:
class MyClass {
// how to store the fields????
getField1At(Instant i) {...}
setField1At(Instant i, String ...) {...}
...
}我目前正在使用JTemporal库,它有一个TemporalAttribute<T>类,它类似于一个映射:您可以在Instant中执行T myAttr.get(Instant i)之类的操作来获取myAttr版本。我知道如何在一个带有Hibernate的表中持久化一个TemporalAttribute (这很简单:我持久化了TemporalAttribute使用的SortedMap,得到了一个具有开始和结束有效时间和属性值的表)。
真正的问题是,这里我们有多个属性。
我有一个解决方案,但还不清楚,我想听听你的想法。
发布于 2010-11-30 20:12:10
你的项目让我想起了冬眠寄主。
Envers项目的目标是支持对持久类的轻松审核。您所要做的就是用@ audit注释您想要审计的持久性类或它的一些属性。对于每个已审计实体,将创建一个表,该表将保存对该实体所做更改的历史记录。然后,您可以检索和查询历史数据,而无需付出很大的努力。
使用Hibernate实现这个解耦实体和修订数据(在数据库和您的代码中)。
发布于 2010-11-30 20:11:28
您只需将版本号添加到域类中,就可以这样做。我做了这样的事情,其中Id是db分配的号码和版本号之间的组合,但我建议不要这样做。使用普通的代理键,如果你真的想要的话,让id,版本元组成为一个自然的键。
实际上,您可以通过确保图中所有元素的版本号是相同的,就可以这样对整个对象图进行版本化。然后,您可以轻松地返回到以前的任何版本。
您应该编写大量的服务测试,以确保管理版本的代码的完整性。
https://stackoverflow.com/questions/4317347
复制相似问题