Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否手动更新用于在Hibernate中生成主键的计数器?_Java_Sql_Spring_Hibernate_Postgresql - Fatal编程技术网

Java 是否手动更新用于在Hibernate中生成主键的计数器?

Java 是否手动更新用于在Hibernate中生成主键的计数器?,java,sql,spring,hibernate,postgresql,Java,Sql,Spring,Hibernate,Postgresql,在我的spring项目中,数据库中的表是由Hibernate使用我的实体类作为基础自动创建的,但我在表中手动插入了一些默认值(使用pgAdmin3) 因此,我现在面临这个问题:当我试图通过Java代码在一个已经有值的表中插入值时,我收到一条错误消息,说数据库中已经存在主键 有人知道如何解决这个问题吗 更新 这就是我在类中声明主键的方式: @Id @Column(name = "id") @GeneratedValue(strategy=GenerationType.AUTO) private i

在我的spring项目中,数据库中的表是由Hibernate使用我的实体类作为基础自动创建的,但我在表中手动插入了一些默认值(使用pgAdmin3)

因此,我现在面临这个问题:当我试图通过Java代码在一个已经有值的表中插入值时,我收到一条错误消息,说数据库中已经存在主键

有人知道如何解决这个问题吗

更新

这就是我在类中声明主键的方式:

@Id
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

对每个表调用此SQL查询一次,以将序列设置为下一个可用数字:

SELECT setval('tblname_id_seq', max(id)) FROM tblname;
tblname
是表的实际名称

Hibernate可能使用不同的命名约定,或者序列可能已重命名。如果找不到列后面的序列,请使用()进行检查:

更多详细信息:


这里的问题可能是您将id声明为原语而不是包装器

因此,不是:

private int id;
你应该:

private Integer id;
创建id为的实体时,该实体初始化为0,而不是NULL

这就是为什么会出现重复的id约束冲突异常


只有当id为NULL时,自动生成策略才会将id分配委托给数据库。

您的主键使用哪种列?我更新我的问题以说明我如何声明我的主键我理解这里是您在postgresql server中更新此tblname_id_seq的示例。但是我没有这个序列,我的主键只由Hibernate处理。@KleberMota:序列号通常由RDBMS处理。每个
serial
列后面都有一个序列对象。有关更多信息,请按照手册的链接进行操作。我添加了一个查找序列的方法。hibernate_sequence是hibernate默认使用的序列的名称。请尝试在pgAdmin3中查找此序列并在上面的查询中使用它。我更新了代码以将Id更改为整数,但仍然存在相同的问题(顺便说一句,实体不是用0初始化的,而是用一系列数字中的最后一个数字初始化的——在最后一个数字是9的时刻——这与我通过程序插入的元素数相匹配,因为我认为Hibernate有自己的计数器)。:“我们建议您在持久类上声明一致命名的标识符属性,并使用可为空(即非原语)类型。“至于手动插入的默认值,请确保在插入这些值时始终使用序列,而不要手动赋值。最好将主键设置为:id bigint NOT NULL default nextval('my_table_sequence'::regclass)
private Integer id;