繁体   English   中英

在Java中保留表格的历史记录

[英]keeping the history of table in java

我需要Java中的示例程序来保留表的历史记录(如果用户在该表上插入,更新和删除了该表)。 有人可以帮忙吗?

提前致谢。

如果您使用的是Hibernate ,则可以使用Envers解决此问题。

您有两种选择:

  1. 让数据库使用触发器自动处理此问题。 我不知道您正在使用哪个数据库,但是它们都支持可用于此的触发器。
  2. 在您的程序中编写代码,以在插入,更新和删除用户时执行类似的操作。

就个人而言,我更喜欢第一种选择。 它可能需要较少的维护。 您可能在多个地方更新用户,所有这些地方都需要代码来更新另一个表。 此外,在数据库中,您还有更多用于指定所需值和完整性约束的选项。

触发器是不建议使用的,当我将审计数据存储在文件中时,否则我没有使用数据库...我的建议是创建表“ AUDIT”并在Servlet的帮助下编写Java代码,并将数据存储在文件或DB或其他文件中DB也...

好吧,我们通常有自己的历史记录表,(大多数情况下)看起来像原始表。 由于大多数表已经具有创建日期,修改日期和相应的用户,因此我们要做的就是将创建日期为now()的数据集从实时表复制到历史表。

我们正在使用Hibernate,因此可以在拦截器中完成,但是可能还有其他选项,例如某些数据库触发器执行脚本等。

这是Java问题吗?

这应该在数据库部分中移动。

您需要创建一个历史表。 然后在原始表上创建数据库触发器,以便“在插入或更新或删除表中的每一行之前创建或替换触发器...。”

我认为可以通过在sql-server中创建触发器来实现。 您可以按以下方式创建触发器:

句法:

创建触发器触发器名称{ 之后} {插入| 更新| DELETE} ON table_name每行触发的语句

您将必须创建2个触发器,一个在执行操作之前创建,而另一个在执行操作之后创建。 否则它也可以通过代码来实现,但是在批处理过程中,代码要处理起来会有些繁琐。

您应该尝试使用触发器。 您可以有一个单独的表(需要维护其历史记录的表的精确副本)。

然后,在主表上进行每次插入/更新/删除操作后,将通过触发器来更新该表。

然后,您可以编写Java代码以从第二个历史记录表中获取这些更改。

我认为您可以使用基础数据库的重做日志来跟踪执行的操作。 参加该计划有什么特别的理由吗?

您可以尝试从表中创建一个对象列表(假设您有数据对象)。 哪一个可以让您遍历列表并与表中的当前数据进行比较? 然后,您将能够查看是否发生了任何更改。

您甚至可以使用包含枚举器的对象创建另一个列表,该枚举器为您提供操作(删除,更新,创建)以及新数据。

以前没有做过,只是一个想法。

就像提到的@Ashish一样,触发器可用于插入单独的表中-通常称为Audit-Trail表Audit Log表

以下是此类审计跟踪表中通常定义的列:“操作”(插入,更新,删除),表名(插入/删除/更新表的表),键( 根据需要该表的主键),时间戳(执行此操作的时间)

最好在整个事务完成后审核日志。 如果不是这样,则在将异常传递回代码端的情况下,将需要单独调用更新审核表。 希望这可以帮助。

如果您在谈论数据库表,则可以在数据库中使用触发器,也可以在应用程序中添加一些额外的代码-可能使用方面。 如果您使用的是JPA,则可以使用实体侦听器或执行一些额外的逻辑,以向DAO对象添加某些方面,并将特定方面应用于所有对需要维持历史数据的实体执行CRUD的DAO。 如果您的DAO对象是无状态Bean,则可以使用Interceptor来实现在其他情况下使用Java代理功能,cglib或其他可以为您提供方面功能的lib。 如果您使用的是Spring而不是EJB,则可以在应用程序上下文配置文件中建议DAO。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM