Spring JPA 仅在字段修改时保存

问题描述 投票:0回答:1

在Spring JPA中,我没有找到任何有关仅在字段修改时才保存实体的内容

从 JPA 获取记录后,在保存实体之前如何验证字段是否有修改/更改。 这就是我的做法

hasModifications
功能中我可以比较如果
obj.field!=cloneObject.field
然后只保存

Class obj = repository.findById(id);
Class cloneObj = cloneObject(obj);
process(obj);
    if (hasModifications(obj,cloneObj))
       repository.save(obj);
     else
       //don't save

我尝试在类级别添加

@DynamicUpdate
注释。但这没有用。还有其他干净的方法可以做到这一点吗?

编辑: 我问这个是因为我在 MySql DB 中有一个名为 last_updated_at 的字段。每当我调用保存时,该字段都会使用当前时间戳进行更新,但不会更新其他字段值。 所以这就是我问这个问题的原因 这是表定义

'CREATE TABLE `username` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `info` mediumtext,
  `status` varchar(255) NOT NULL,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `version` int NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_updated_at` (`updated_at`),
  KEY `idx_created_at` (`created_at`)
)
java spring spring-data-jpa entitymanager
1个回答
0
投票

Spring 不会在这里做任何事情。这一切都由 JPA 处理。您不需要在这里做任何事情。 JPA 提供者将自行确定实体是否被修改,因此需要发布更新。

也不需要显式保存实体。一旦从存储库中检索到它,它就由实体管理器进行管理。从那时起,对实体的所有更改都会被跟踪,并且一旦触发数据库刷新(例如事务完成时),就会同步到数据库。

所以您唯一需要的代码是:

SomeEntity obj = repository.findById(id);
process(obj);

必须在事务中执行(如在

@Transactional
方法中)。

© www.soinside.com 2019 - 2024. All rights reserved.