当前位置: 首页 > 知识库问答 >
问题:

H2 中与 GenerationType.IDENTITY 的问题

袁何平
2023-03-14

我试图创建和预加载嵌入式H2 Db与一些数据使用schema.sql.但一旦我尝试使用POST请求添加新用户,发生以下错误。

2022-07-04 23:35:53.153 错误 8180 --- [NIO-8080-exec-2] O.A.C.C.C.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] 在路径 [] 的上下文中抛出了异常 [请求处理失败;嵌套异常是 org.springframework.dao.DataIntegrityViolationException: 无法执行语句;SQL [n/a];约束 [“公共上的主键。用户(USER_ID) ( /* 键:1 */ 1, 'mrxxx', 'mrxxx@gmail.com', '123456')“;SQL语句:插入用户(user_id、电子邮件、user_name、密码)值(默认值,?, ?, ?)[23505-214]];嵌套异常是 org.hibernate.exception.ConstraintViolationException: 无法执行语句] 与根本原因

org.h2.jdbc.JdbcSQL57ityConstraintViolationExc的:唯一索引或主键冲突:"PRIMary KEY ONPUBLIC.USERS(USER_ID) ( /* key: 1*/1,'mrxxx','mrxxx@gmail.com','123456')";SQL语句:插入到用户(user_id, email,user_name,密码)值(默认, ?, ?, ?) [23505-214]

我猜这是因为@ generated value(strategy = generation type。IDENTITY)正在尝试创建user_id = 1,但它已经存在于Db中,因为我们已经预加载了它。我不知道如何摆脱它

要求

{
    "name" : "Arunkumar",
    "email" : "arunkavi@gmail.com",
    "password" : "arun1234" 
}

反应

{
    "timestamp": "2022-07-04T18:05:53.184+00:00",
    "status": 500,
    "error": "Internal Server Error",
    "path": "/post"
}

请找到下面的代码段

应用程序.属性

spring.jpa.hibernate.ddl-auto=none
spring.datasource.initialization-mode=always

spring.h2.console.enabled=true
spring.h2.console.path=/h2
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name= org.h2.Driver
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

架构.sql

DROP TABLE IF EXISTS `users`;

CREATE TABLE `users` (
  `user_id` int NOT NULL AUTO_INCREMENT,
  `user_name` varchar(45) DEFAULT NULL,
  `email` varchar(45) DEFAULT NULL,
  `password` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
);

INSERT INTO `users` VALUES (1,'mrxxx', 'mrxxx@gmail.com', '123456');

用户.java

@Entity
public class Users {    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="USER_ID")
    private int id;
    @Column(name="USER_NAME")
    private String name;
    @Column(name="PASSWORD")
    private String password;
    @Column(name="EMAIL")
    private String email;
    .......
}

DbCotroller.java

@RestController
public class DbController {

    @Autowired
    private DbRepo userRepo;
    
    @PostMapping("/post")
    public ResponseEntity<?> saveUser(@RequestBody Users user){
        userRepo.save(user);
        return new ResponseEntity<>(user, HttpStatus.CREATED);
    }
}

共有1个答案

暴夕
2023-03-14

您可以在插入查询中省略id:

INSERT INTO `users`(`USER_NAME`,`EMAIL`,`PASSWORD`) VALUES ('mrxxx', 'mrxxx@gmail.com', '123456');
 类似资料:
  • 我开始制作一个简单的spring boot应用程序。 我的第一步是利用Spring JDBC支持,使用默认的H2内存数据库。对于示例数据,我在src/main/resources中有schema.sql和data.sql。 所以当spring启动时,它也会执行这两个脚本并填充H2数据库,我可以通过H2控制台访问它。

  • 我在MySQL中创建了一个表,该表已启动,并且运行良好。但为了测试,我定义了一个带有H2的内存中数据库,它使用相同的DDL来克隆我可以用来测试我的应用程序的表。 但是,当我尝试为测试初始化表时,它会返回以下错误: 原因:组织。h2.jdbc。JdbcSQLException:未知的数据类型:“fieldF”; 这几乎是错误带来的最大帮助。我已经显式地将字段F设置为VARCHAR(40),那么我还需

  • 配置详情 Spring:2.6 我创建了一个带有插件的Spring启动应用程序 春网 H2数据库 pom。xml 应用属性 命令行运行 作者epository.java 著者java(Pojo) 当我启动应用程序并转到http://localhost:8080/h2-console时,我看到一个jdbc: h2:~/test的JDBC URL,而不是jdbc: h2: mem: AS。在控制台中登

  • 我正在尝试运行一个CRUD应用程序,但我得到了一个错误 2020-12-22 09:48:40.787警告83274--[main]ConfigServletWebServerApplicationContext:上下文初始化过程中遇到异常-取消刷新尝试:org.springframework.beans.factory.unsatistifiedDependencyException:创建名为“

  • 我想在状态设置为“过去”时保存投票结果。我有一个H2 db,想添加一个只存储结果的mongoDB。我如何用Spring boot实现这一点? 到目前为止,我有一个投票程序,您可以在其中创建投票、编辑投票、投票等。 我添加了mongoDB,Spring引导,Springmvc和H2 db等依赖项。 这是我的应用程序属性: 我尝试过做一个接口mongoRepository: 投票类别:

  • 有人知道为什么吗?我该怎么解决?