为什么我用save保存更新,数据库不更新,反而新增一条

news2024/11/19 16:33:30

今天发现一个奇怪的问题:

为什么我用save保存更新的数据后,数据库不更新,但是增加了一条空数据,我的前台也把数据用json传上去了,也成功了,但是数据库没有更新相应行的数据,而是新增了一条数据,我的后端用的接口PagingAndSortingRepository,数据库hibernate+sqlserver。

前端请求代码:

request(selectedRow,'post','<%=basePath%>userManager/save',function(data){
    console.log("data:"+data);
});

请求明细数据:

后端接口:

public interface UserManagerDAO extends PagingAndSortingRepository<User, Long>{
}

数据库显示:

我准备重现一下这个问题,下面的搭建过程和运行结果。

(Spring Data JPA入门案例,包含mysql、mssql增删改查、分页,主键自动生成)

1.环境准备

首先,确保你的Spring Boot项目已经配置了相关依赖。在pom.xml中加入以下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>mssql-jdbc</artifactId>
        <version>7.4.1.jre8</version>
    </dependency>
</dependencies>

2.应用配置

application.properties中配置数据库连接:

# 应用服务 WEB 访问端口
server.port=8080

# spring.datasource.url=jdbc:mysql://localhost:3306/award?useSSL=false&serverTimezone=UTC
# spring.datasource.username=root
# spring.datasource.password=123456
# spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
# spring.jpa.hibernate.ddl-auto=update
# spring.jpa.show-sql=true

spring.datasource.url=jdbc:sqlserver://127.0.0.1:1433;databaseName=award
spring.datasource.username=sa
spring.datasource.password=A123456
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver

spring.main.lazy-initialization=true

3.实体类 (Entity)

假设我们有一个用户(User)实体,主键自增。

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String password;
    private String role;
    @Column(name = "addtime", insertable = false, updatable = false)
    private byte[] addtime;    
    // Getters and Setters
}

4.Repository 接口

Spring Data JPA会根据接口方法名自动生成查询语句。

import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends PagingAndSortingRepository<User, Long> {
    List<User> findByUsername(String username);
    Page<User> findAll(Pageable pageable);
}

5.Service 层

服务层用于业务逻辑处理。

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User save(User user) {
        return userRepository.save(user);
    }

    public void delete(User user) {
        userRepository.delete(user);
    }

    public User findById(Long id) {
        return userRepository.findById(id).orElse(null);
    }

    public List<User> findByName(String name) {
        return userRepository.findByUsername(name);
    }

    public Page<User> findAllPaged(int page, int size) {
        Pageable pageable = PageRequest.of(page, size);
        return userRepository.findAll(pageable);
    }

    public User update(Long id, User userDetails) {
        return userRepository.save(userDetails);
    }

    public boolean deleteById(Long id) {
        userRepository.deleteById(id);
        return true;
    }

    public Page<User> findAllPaged(Pageable pageable) {
        return userRepository.findAll(pageable);
    }
}

6.Controller 层

控制器负责接收HTTP请求并响应。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/users")
public class UserController {

    @Autowired
    private UserService userService;

    // 创建(新增)
    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        User savedUser = userService.save(user);
        return new ResponseEntity<>(savedUser, HttpStatus.CREATED);
    }

    // 查询(读取)
    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.findById(id);
        if (user != null) {
            return new ResponseEntity<>(user, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

    // 更新
    @PutMapping("/{id}")
    public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User userDetails) {
        User updatedUser = userService.update(id, userDetails);
        if (updatedUser != null) {
            return new ResponseEntity<>(updatedUser, HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

    // 删除
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
        boolean isDeleted = userService.deleteById(id);
        if (isDeleted) {
            return new ResponseEntity<>(HttpStatus.NO_CONTENT);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

    // 分页查询
    @GetMapping
    public ResponseEntity<Page<User>> getUsers(
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size) {
        Pageable pageable = PageRequest.of(page, size);
        Page<User> usersPage = userService.findAllPaged(pageable);
        return new ResponseEntity<>(usersPage, HttpStatus.OK);
    }
}

7.MySQL

建表语句

CREATE TABLE `users` (
	`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
	`username` VARCHAR(100) NOT NULL COMMENT '用户名',
	`password` VARCHAR(100) NOT NULL COMMENT '密码',
	`role` VARCHAR(100) NULL DEFAULT '管理员' COMMENT '角色',
	`addtime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '新增时间',
	PRIMARY KEY (`id`)
) COMMENT='用户表' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

8.MSSQL

建表语句

CREATE TABLE [dbo].[users](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[username] [varchar](50) NOT NULL,
	[password] [varchar](50) NOT NULL,
	[role] [varchar](50) NULL,
	[addtime] [timestamp] NULL,
 CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

9.启动

成功启动

Tomcat started on port(s): 8080 (http)
Started JpademoApplication in 4.702 seconds (JVM running for 5.149)

10.新增用户

调用成功

11.查询用户

调用成功

12.修改用户

调用成功

所以,我没有重现这个问题,有可能是id传到后台的时候,丢失导致的,当所有可能都已经排除,那只剩这种可能了,网络数据丢包也会导致问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1683350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA学习笔记之Nios II(一)简单介绍及新建工程及下载

系列文章目录 文章目录 系列文章目录前言QsysNios IIhello world 实例Platform DesignNios II程序设计 前言 利用Quartus中的Qsys工具&#xff0c;可以实现在FPGA里面跑嵌入式的功能 Qsys Altera 公司将主控制器、数字信号处理模块、存储器及其控制模块、各种接口协议等模块&…

机器学习圣经PRML作者Bishop推出重磅教材

图1 书籍《Pattern Recognition and Machine Learning》 只要学人工智能的人&#xff0c;必然学机器学习。 只要学机器学习的人&#xff0c;必然看PRML。 PRML为何物&#xff1f; PRML全名《Pattern Recognition and Machine Learning》&#xff0c;一部机器学习领域的内功…

【vue-3】动态属性绑定v-bind

1、文本动态绑定&#xff1a; <input type"text" v-bind:value"web.url"> 简写&#xff1a; <input type"text" :value"web.url"> 2、文字样式动态绑定 <b :class"{textColor:web.fontStatus}">vue学…

linuk shell脚本

1,创建变 只需要变量名变量 值 如果有空格则要用引号 等号两边不能有空格 变量名不能以数字开头 2.输出变量 echo $变量名 3&#xff0c;重复定义变量叠加 前两行没加$导致错误 4&#xff0c;变量的删除 unset 变量名 5&#xff0c;read 变量名 有-p 就会打印引号地内容…

微软文字转语音小工具(Text to speech)网页版

在线文字转语音工具&#xff1a;在线文本转语音 (text-to-speech.cn) 随着科技的迅猛发展&#xff0c;人工智能技术日益成熟&#xff0c;AI配音作为其中的一项重要应用&#xff0c;正在以惊人的速度改变着我们的生活。所谓AI配音&#xff0c;指的是利用人工智能技术模拟人类声音…

使用决策树对金融贷款数据进行分析

使用决策树对金融贷款数据进行分析 在本篇博客中&#xff0c;我们将通过使用 Python、Pandas 和多种机器学习技术&#xff0c;对一组贷款数据进行全面分析。通过详细的步骤展示&#xff0c;你将学会如何进行数据预处理、可视化分析以及构建预测模型。 第一步&#xff1a;导入…

2024-5-23 石群电路-14

2024-5-23&#xff0c;星期四&#xff0c;22:20&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。今天没有什么重要的事情发生&#xff0c;心情一如既往的平静&#xff0c;距离返校假期还有两天~~~。 今天观看了石群老师电路基础课程的第23/24个视频&#xff0…

蓝牙Classic加密算法设计和实现,SAFER+,E0,E1,E2,E3(python)

概述 之前用python给大家实现了所有LE相关加密工具算法。bobwenstudy/BluetoothCryptographicToolbox: LE SMP加密算法设计和实现(python) (github.com)&#xff0c;最近重温了下Classic加密&#xff0c;顺便将Classic所有加密算法给实现了一遍。 在蓝牙Classic Spec中&#…

IS-IS基本配置 IS-IS邻接关系

一.IS-IS基本配置 原理概述 和 OSPF 路由协议一样&#xff0c; IS-IS 也是一个应用非常广泛的 IGP 路由协议&#xff0c;很多 ISP 网络、特别是大型的ISP网络都部署了IS-IS网络协议。 RIP 、 OSPF 等许多 IGP 都是针对 IP ( Internet Protocol &#xff09;这个网络层协议而开…

深度学习之基于YoloV5人体姿态摔倒识别分析报警系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着人口老龄化的加剧和人们对健康安全的日益关注&#xff0c;摔倒事件在老年人、幼儿、体育运…

PMP项目管理资料

需要原件的私我&#xff01;&#xff01;&#xff01; 各种编程相关资料学习

Stable Diffusion【写实模型】:逼真,逼真,超级逼真的国产超写实摄影大模型万享XL

今天和大家分享的是一个国产万享系列中使用量最高的大模型:万享XL_超写实摄影&#xff0c;顾名思义&#xff0c;该大模型主要是面向写实摄影&#xff0c;一方面生成的图片人物皮肤纹理细节超级逼真&#xff0c;另一方面对于光影效果的处理也非常到位。对于万享XL超写实摄影大模…

Linux多线程系列2: 模拟封装简易语言级线程库,线程互斥和锁,线程同步和条件变量,线程其他知识点

Linux多线程系列2: 模拟封装简易语言级线程库,线程互斥和互斥锁,线程同步和条件变量,线程其他知识点 1.前言 一.模拟C11线程库自己封装简易语言级线程库1.实现框架2.迅速把构造等等函数写完3.start和work1.尝试一2.尝试二3.最终版本4.给出代码 二.模拟实现多线程(为编写线程池做…

互联网医院开发:引领智慧医疗新时代

随着科技的迅猛发展和互联网的普及&#xff0c;传统医疗模式正在迎来一场深刻的变革。互联网医院的崛起&#xff0c;打破了时间和空间的限制&#xff0c;为患者和医疗机构带来了更加便捷、高效、安全的医疗服务体验。本文将从技术角度深入探讨互联网医院的开发&#xff0c;包括…

Hotcoin Research | 市场洞察:2024年5月13日-5月19日

加密货币市场表现 目前&#xff0c;加密货币总市值为1.32万亿&#xff0c;BTC占比54.41%。 本周行情呈现震荡上行的态势&#xff0c;BTC在5月15日-16日&#xff0c;有一波大的拉升&#xff0c;周末为震荡行情。BTC现价为67125美元。 上涨的主要原因&#xff1a;美国4月CPI为3…

安防监控视频平台EasyNVR级联视频上云系统EasyNVS出现“Login error”报错的原因排查

EasyNVR安防视频云平台是旭帆科技TSINGSEE青犀旗下支持RTSP/Onvif协议接入的安防监控流媒体视频云平台。平台具备视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频能力&#xff0c;能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、W…

RNN-循环神经网络

目录 词嵌入层 RNN网络层 RNN 网络原理 这一节我们学习循环神经网络&#xff0c;RNN~~ 自然语言处理&#xff08;Nature language Processing, NLP&#xff09;研究的主要是通过计算机算法来理解自然语言。对于自然语言来说&#xff0c;处理的数据主要就是人类的语言&#…

安卓绕过限制直接使用Android/data无需授权,支持安卓14(部分)

大家都知道&#xff0c;安卓每次更新都会给权限划分的更细、收的更紧。   早在安卓11的时候还可以直接通过授权Android/data来实现操作其他软件的目录&#xff0c;没有之前安卓11授权的图了&#xff0c;反正都长一个样&#xff0c;就直接贴新图了。   后面到了安卓12~13的…

基于语音识别的智能电子病历(三)之 M*Modal

讨论“基于语音识别的智能电子病历”&#xff0c;就绕不开 Nuance 和 M*Modal。这2个公司长时间的占据第一和第二的位置。下面介绍一下M*Modal。 这是2019年的一个新闻“专业医疗软件提供商3M公司为自己购买了一份圣诞礼物&#xff0c;即M*Modal IP LLC的医疗技术业务&#xf…

Github上传时报错The file path is empty的解决办法

问题截图 文件夹明明不是空的&#xff0c;却怎么都上传不上去。 解决方案&#xff1a; 打开隐藏文件的开关&#xff0c;删除原作者的.git文件 如图所示&#xff1a; 上传成功&#xff01;