-1

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

提前致谢。

4

11 回答 11

3

如果你正在使用Hibernate,你可以使用Envers来解决这个问题。

于 2011-03-29T08:08:30.047 回答
1

为此,您有两种选择:

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

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

于 2011-03-31T05:58:14.830 回答
0

就像@Ashish 提到的那样,触发器可用于插入单独的表 - 这通常称为Audit-Trail 表审计日志表

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

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

于 2011-03-29T07:52:07.533 回答
0

I think you can use the redo log of your underlying database to keep track of the operation performed. Is there any particular reason to go for the program?

于 2011-03-29T07:42:06.970 回答
0

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

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

于 2011-03-21T07:38:40.537 回答
0

这是一个Java问题吗?

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

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

于 2011-03-21T07:39:31.423 回答
0

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

句法:

CREATE TRIGGER trigger_name {之前 | 之后 } {插入 | 更新 | DELETE } ON table_name FOR EACH ROW trigger_statement

您必须在执行操作之前创建 2 个触发器,在执行操作之后创建另一个触发器。否则它也可以通过代码来实现,但是在批处理的情况下代码处理会有点乏味。

于 2011-03-21T07:42:36.873 回答
0

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

于 2011-03-29T08:02:50.713 回答
0

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

于 2015-03-02T09:30:11.057 回答
0

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

然后,在主表上的每次插入/更新/删除后,该表将由触发器更新。

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

于 2011-03-29T07:35:28.257 回答
0

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

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

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

于 2011-03-29T07:49:23.780 回答