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

17 篇文章 0 订阅
4 篇文章 0 订阅

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

为什么我用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传到后台的时候,丢失导致的,当所有可能都已经排除,那只剩这种可能了,网络数据丢包也会导致问题。

  • 15
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 NestJS 中向数据库表中新增一条数据,需要先使用相应的 ORM 框架(如 TypeORM 或 Sequelize)创建实体类,然后在控制器中调用相应的服务来实现。以下是一个简单的示例: 1. 创建一个 `User` 实体类(使用 TypeORM 作为 ORM 框架): ```typescript import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; @Column() email: string; } ``` 2. 创建一个 `UserService` 服务,用于操作 `User` 实体类: ```typescript import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { User } from './user.entity'; @Injectable() export class UserService { constructor( @InjectRepository(User) private userRepository: Repository<User>, ) {} async create(user: User): Promise<User> { return this.userRepository.save(user); } } ``` 3. 在控制器中调用 `UserService` 的 `create` 方法来新增一条数据: ```typescript import { Body, Controller, Post } from '@nestjs/common'; import { User } from './user.entity'; import { UserService } from './user.service'; @Controller('users') export class UserController { constructor(private readonly userService: UserService) {} @Post() async create(@Body() user: User): Promise<User> { return this.userService.create(user); } } ``` 在这个示例中,我们在 `UserController` 中定义了一个 `create` 方法,用于接收一个 `User` 对象,并将其传递给 `UserService` 中的 `create` 方法,最终将数据保存数据库中。你可以按照这个示例,根据你的实际需求来修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

svygh123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值