目前,我有一个Angular2应用程序,它有一个包含嵌套对象的对象。用户按照向导的提示更新对象的任何部分,然后单击保存。目前,我只是将整个对象发送到服务器端进行更新。为了进行更新,我从数据库中获取数据库副本,并将客户机副本中的所有字段设置到数据库副本上,而不管这些字段是否已更改,然后保存它们。这意味着我还必须遍历所有嵌套的对象,将它们从数据库中拉出,并设置它们的所有属性,等等。所有的东西都会更新,即使它没有改变。
这是我通常的做法,但对于这个应用程序,我需要保留一个对象更改的审计日志。如果每次主对象更新时,每个其他子对象都记录它也被更新,这将是很困难的。
有没有一种优雅的方法来确保服务器端只知道更新已更改的内容(因此只触发该对象的审计日志,而不会浪费时间在数据库上进行更新)。
我正在考虑创建一个对象,该对象在用户更改向导中的内容时在客户端存储脏对象列表,并将其与对象一起发送到服务器,这样我就可以知道哪些对象需要更新。
或者,我是否应该像现在一样将整个对象发送到服务器,并首先将其与原始数据库对象进行比较(通过遍历所有对象并进行比较),以确定发生了哪些更改?
这似乎有很多工作要做。我想知道是否有一种标准的方法/最佳实践来做到这一点。
编辑2018-04-24:我刚刚发现了BreezeJS。这是我想用来实现我的目标的东西吗?它跟踪实体及其修改状态,并在需要时将其作为变更集进行相应更新。有没有其他类似的东西是我应该调查的?
发布于 2018-05-30 10:45:14
在github上使用像Tomato这样的实体库。
它是一个java库,其工作方式类似于普通的基于实体的持久化机制,除了提供的单个实体之外,您不需要任何其他实体。提供的单个实体类可以从任何数据库的任何架构中的任何表或表层次结构中加载和保存数据。在代码中,它看起来像这样...
Entity e = Entity.createEntityOrView(schema.tablename);
e.setValue("id", 5);
e.load();
或加载多组记录...
e.setFilter("name = 'rodney');
e.load();
entity类自动知道值何时变脏,因此将整个实体标记为脏。它还知道实体是从表中加载的还是新的(换句话说,您总是调用save(),但它将知道是执行插入还是更新)。
由于所有更改都是通过Entity类中名为save()的单个方法保存的,因此可以在自定义实体类中轻松覆盖此方法,从而允许您修改save()之前和之后发生的操作。在您的自定义实体类中,您将能够输出详细的审计数据,包括表、主键以及更改的值。
在使用JSON的任何地方,就像angular或vue (以及任何非java代码)一样,通过提供的单个web服务,可以使用番茄立即满足数据库的需求。
在github上查看Tomato库!
我是github上的Tomato库的作者。
https://stackoverflow.com/questions/49065647
复制相似问题