首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java和Hibernate存储历史数据

用Java和Hibernate存储历史数据
EN

Stack Overflow用户
提问于 2010-11-30 18:53:41
回答 2查看 5.3K关注 0票数 5

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

代码语言:javascript
复制
class MyClass {
    String field1;
    Integer field2;
    Long field3;

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

    ...
}

现在,假设我需要使MyClass能够存储和检索旧数据,那么最好的方法是什么呢?

requirements也要通过Hibernate来持久化这些类。,每个“实体”最多有两个表:只有一个表或一个表表示“连续性”类(一个表代表随着时间推移的实体),另一个表用于历史数据(按照这里的建议)

请注意,我必须能够为字段的值分配任意的有效时间。

类应该有一个接口,类似于:

代码语言:javascript
复制
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,得到了一个具有开始和结束有效时间和属性值的表)。

真正的问题是,这里我们有多个属性。

我有一个解决方案,但还不清楚,我想听听你的想法。

EN

回答 2

Stack Overflow用户

发布于 2010-11-30 20:12:10

你的项目让我想起了冬眠寄主

Envers项目的目标是支持对持久类的轻松审核。您所要做的就是用@ audit注释您想要审计的持久性类或它的一些属性。对于每个已审计实体,将创建一个表,该表将保存对该实体所做更改的历史记录。然后,您可以检索和查询历史数据,而无需付出很大的努力。

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

使用Hibernate实现这个解耦实体和修订数据(在数据库和您的代码中)。

票数 5
EN

Stack Overflow用户

发布于 2010-11-30 20:11:28

您只需将版本号添加到域类中,就可以这样做。我做了这样的事情,其中Id是db分配的号码和版本号之间的组合,但我建议不要这样做。使用普通的代理键,如果你真的想要的话,让id,版本元组成为一个自然的键。

实际上,您可以通过确保图中所有元素的版本号是相同的,就可以这样对整个对象图进行版本化。然后,您可以轻松地返回到以前的任何版本。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4317347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档