Java 如何仅更新字段子集并更新存储库?

Java 如何仅更新字段子集并更新存储库?,java,hibernate,spring-boot,jpa,postman,Java,Hibernate,Spring Boot,Jpa,Postman,我正在制作一个spring引导应用程序,我希望通过我的服务和控制器更新数据库中的现有条目。在我的服务层,我有下面的方法。因此,我正在检索与caseID关联的字段,创建一个模型映射器,该映射器将我的实体对象类映射到我的VO,然后将检索到的数据映射到我的DTO。然后我保存我的存储库。其目的是只添加我在req消息中指定的字段,即如果我只想更新20个字段中的1个,它会更新此字段,其余字段保持不变。下面的代码运行成功,但我在postman中的请求消息中指定的字段在数据库中未更新。为什么会这样?我尝试过映射

我正在制作一个spring引导应用程序,我希望通过我的服务和控制器更新数据库中的现有条目。在我的服务层,我有下面的方法。因此,我正在检索与caseID关联的字段,创建一个模型映射器,该映射器将我的实体对象类映射到我的VO,然后将检索到的数据映射到我的DTO。然后我保存我的存储库。其目的是只添加我在req消息中指定的字段,即如果我只想更新20个字段中的1个,它会更新此字段,其余字段保持不变。下面的代码运行成功,但我在postman中的请求消息中指定的字段在数据库中未更新。为什么会这样?我尝试过映射不同的对象并将不同的变量保存到存储库中,但似乎没有任何东西可以更新数据库

public StoredOutboundErrorCaseVO updateCase(OutboundErrorCaseVO outboundErrorCaseVO, Long caseNumber) {
    OutboundErrorCaseData existingCaseData = ErrorCaseDataRepository.findById(caseNumber).get();
    ModelMapper mm = new ModelMapper();
    mm.getConfiguration().setAmbiguityIgnored(true);
    OutboundErrorCaseData uiOutboundErrorCaseData = mm.map(outboundErrorCaseVO,
            OutboundErrorCaseData.class);
    mm.map(existingCaseData, uiOutboundErrorCaseData);
    ErrorCaseDataRepository.save(uiOutboundErrorCaseData);
    return mm.map(uiOutboundErrorCaseData, StoredOutboundErrorCaseVO.class);
}
控制器-为简洁起见省略代码,POST方法(我通常使用PUT进行更新,但我相信我仍然可以使用POST)

回购

@存储库
公共接口OutboundErrorCaseDataRepository扩展了JpaRepository{

您正在获取数据并将其传递到
existingCaseData
中,然后保存
uiOutboundErrorCaseData
。因此我猜Hibernate正在使用新Id和更新的值向数据库中添加一个新对象。这当然取决于您的模型定义。尤其是
Id


我还认为,如果您在Hibernate会话中已经有一个对象与该Id关联,Hibernate将不允许您使用相同的Id保存
uiOutboundErrorCaseData
。因此,为什么不使用新值更新
existingCaseData
,并将其保存回去呢。

我创建了一个可行的解决方案,尽管我意识到它可以改进,但它确实有效唯一的缺点是我需要指定所有可以更新的字段,理想情况下,我需要一个解决方案,该解决方案接受n个字段并更新记录

OutboundErrorCaseData existingCaseDta = ErrorCaseDataRepository.findById(caseNumber).get();
    if (outboundErrorCaseVO.getChannel() != null) {
        existingCaseDta.setChannel(outboundErrorCaseVO.getChannel());
    }
ErrorCaseDataRepository.save(existingCaseDta);
    ModelMapper mm = new ModelMapper();
    return mm.map(existingCaseDta, StoredOutboundErrorCaseVO.class);

您是否正在使用
spring data
JpaRepository?如果否,则共享
ErrorCaseDataRepository.save()的实现
,这很难理解。您是否静态使用存储库?它应该是一个连接到服务的bean是的,repo自动连接到服务。我已编辑显示impl。您可以告诉我existingCaseData.getId()的值(或者实体Id的getter方法是什么)吗?
    @Repository
public interface OutboundErrorCaseDataRepository extends JpaRepository<OutboundErrorCaseData, Long> {
OutboundErrorCaseData existingCaseDta = ErrorCaseDataRepository.findById(caseNumber).get();
    if (outboundErrorCaseVO.getChannel() != null) {
        existingCaseDta.setChannel(outboundErrorCaseVO.getChannel());
    }
ErrorCaseDataRepository.save(existingCaseDta);
    ModelMapper mm = new ModelMapper();
    return mm.map(existingCaseDta, StoredOutboundErrorCaseVO.class);