在我的应用程序中,我有一组在整个应用程序生命周期中保持 Activity 状态的对象,我需要创建它们的历史数据库。
这些对象是使用 Hibernate 注释进行注释的 Java/Scala 类层次结构的实例,我在应用程序中使用 Hibernate 注释来在启动时加载它们。幸运的是,所有类都已经包含时间戳,这意味着我不需要更改对象模型就能够创建历史记录。
最合适的方法是什么:
使用不带注解的 Hibernate 并提供外部 xml 映射,这与除主键之外的注解相同(现在是由之前的主键 + 时间戳组成的复合键)
使用其他类来记录历史记录(这听起来很复杂,因为我确实有一个类的层次结构,而不是单个类,并且我必须为每种类型的记录子类化我的 HistoricalRecordClass,因为我想重新构建它)。还是用Hibernate
使用完全不同的方法(请注意,我不喜欢 ORMS,这只是为了方便)
一些注意事项:
存储历史记录的目标是用户可以通过单个 GUI,仅通过指定日期来访问某些数据的实时值或历史值。
最佳答案
您打算如何使用历史记录?最简单的解决方案是将它们序列化为 JSON 并将它们记录到文件中。
我从未将 hibernate xml 映射与 hibernate 注释结合起来,但如果它有效,听起来比携带两个并行对象模型更有吸引力。
如果您需要能够在任何时间点重新创建应用程序状态,那么您或多或少都会陷入将它们写入数据库的困境(因为快速随机访问)。您可以作弊并拥有一个“历史记录”表,该表具有 id + 时间戳 + 类型的复合键,然后是一个“json”字段,您只需在其中整理并保存它。这将有助于 a) 携带一个历史表而不是一堆克隆表,b) 如果架构发生变化,则为您提供一些灵 active (即利用 JSON 的开放架构性质)
但由于它是具有不同使用模式的存档数据(您只是读取/写入整个记录),因此我会考虑使用其他一些存储方式,而不是使用与实时数据相同的严格架构。
这是“一次编写”范式的一个很好的应用...您有可用的 Hadoop 吗? ;)
关于java - 正确建模数据库中的历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14229965/