@GeneratedValue不会在新会话中从DB获取值

时间:2018-05-01 23:22:15

标签: java spring hibernate jpa

我的要求是让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约束错误。它正在尝试使用PI作为1

插入新记录

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

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

PS:我已经尝试过以下策略而且没有任何工作

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

1 个答案:

答案 0 :(得分:1)

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

  1. 使用支持标识列的数据库,
  2. 正确地将主键列定义为标识列。
  3. 因此,例如在PostgreSQL中,您可以像这样定义主键列:

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

    有关此内容的确切信息可在JPA specification第11.1.20节GeneratedValue注释中找到。