Java 仅为更改的字段更新表

Java 仅为更改的字段更新表,java,Java,我有一个person表和映射到该表的person.java。我有一个编辑界面来更改个人记录的详细信息。在编辑页面上,用户通常一次更改1或2个字段。我使用AJAX发送更新调用,只想发送更改的字段。当前正在将整个对象发送回 在后端,问题在于如何仅为更改的字段更新数据库 UI层创建一个Person对象,其中只包含已更改的字段,其余字段将被取消初始化。然后将对象传递给DAO进行持久化。DAO如何知道更改了哪些字段?哪些字段未初始化或故意设置为null以进行更新。当前,整个对象都出现了,所以我更新了所有列

我有一个person表和映射到该表的person.java。我有一个编辑界面来更改个人记录的详细信息。在编辑页面上,用户通常一次更改1或2个字段。我使用AJAX发送更新调用,只想发送更改的字段。当前正在将整个对象发送回

在后端,问题在于如何仅为更改的字段更新数据库

UI层创建一个Person对象,其中只包含已更改的字段,其余字段将被取消初始化。然后将对象传递给DAO进行持久化。DAO如何知道更改了哪些字段?哪些字段未初始化或故意设置为null以进行更新。当前,整个对象都出现了,所以我更新了所有列。

如果您使用ORM(Hibernate)进行持久化,那么您可以使用Hibernate.merge进行选择性更新

JDBC的方法: 将对象保持在会话中,该会话用于使用用户可以编辑的初始值填充UI。
当用户提交更改时,将提交的值与会话中的对象进行比较,并添加到包含字段名和新值的映射中。使用此映射动态创建更新查询。

我通常做的是首先从数据库中获取对象及其所有字段。然后我更新我想要的字段,然后将其发送回DAO。无论发生什么,DAO都会更新整个对象。这样做,刀不在乎哪一个被改变了。
不过,在一些特殊情况下,您可能需要添加另一个DAO方法。

这感觉像是一条艰难的道路。为什么只更新数据库中的特定字段?如果用户将数据提交到表示整个对象的表单,则应更新整个对象。如果逐个字段更新,您将如何检测和处理并发冲突?(例如,两个用户几乎同时更新同一个人的不同字段。从每个用户的角度来看,整个记录都是正确的。但以这种方式合并时,它是不正确的。)记录具有时间戳,因此需要并发性。时间戳指示记录上的哪个字段已更新?毕竟,使用这种设计,用户只更新了一些字段,而不是全部字段。因此,从审计跟踪的角度来看,您将记录一个用户更新了用户实际上没有更新的数据。一个名为updated of type timestamp的列。审计跟踪仅针对已更改的字段捕获,以便报告正确。