gpt4 book ai didi

java - @GenerateValue 不会在新 session 中从数据库中获取值

转载 作者:行者123 更新时间:2023-11-30 06:11:36 24 4
gpt4 key购买 nike

我的要求是让 hibernate 获取现有表中已有的最新 PI 值,并通过将最大 PI 值增加 1 来添加新记录。

下面是我的实体类实现

@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Integer id;

private String name;
}

下面是我的类,我通过它在User表中输入值

@PostMapping("/jpa/users")
public void addUser(@Valid @RequestBody User user)
{
User saved = userRepository.save(user);
}

在启动应用程序之前,我的用户表已具有以下值

id  name
1 sample_name_1
2 sample_name_2

现在,当我启动应用程序并尝试在用户表中插入新值时,它应该输入 PI3 的新记录

示例:下面是 JSON 请求正文(输入)

{
"name": "sample_name_3"
}

出现以下错误

{
"timestamp": "2018-05-01T23:09:31.806+0000",
"status": 500,
"error": "Internal Server Error",
"message": "could not execute statement; SQL [n/a]; constraint [\"PRIMARY KEY ON PUBLIC.USER(ID)\"; SQL statement:\ninsert into user (name, id) values (?, ?) [23505-197]]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement",
"path": "/jpa/users"
}

我知道它存在 PrimaryIndex 约束错误。它正在尝试插入 PI1

的新记录

如果我的 user 表为空,并且当我插入几条记录时,它会添加新的自动递增值。因此,我认为 Hibernate 没有从 user 表中读取 id 列的最新值。

我应该使用什么注释让hibernate每次插入新记录之前都读取id的最新值。

PS:我已经尝试过以下策略,但都不起作用

GenerationType.TABLE
GenerationType.AUTO
GenerationType.SEQUENCE
GenerationType.IDENTITY

最佳答案

您要使用的生成类型是GenerationType.IDENTITY,但是您需要

  1. 使用支持标识列的数据库,并且
  2. 正确地将主键列定义为标识列。

例如,在 PostgreSQL 中,您可以像这样定义主键列:

CREATE TABLE mytable (
id serial primary key,
...

有关此问题的最终信息可在 JPA specification 中找到。根据第 11.1.20 生成值注释部分。

关于java - @GenerateValue 不会在新 session 中从数据库中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50125138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com