手动更新用于在Hibernate中生成主键的计数器?
在我的spring项目中,数据库中的表是由Hibernate使用我的实体类作为基础自动创建的,但我手动在表中插入一些默认值(使用pgAdmin3)。
因为那,我现在面临这个问题:当我尝试通过Java代码在已经有值的一个表中插入一个值时,我收到一条错误消息,说主键已经存在于数据库中。
谁知道如何解决这个问题?
UPDATE
这就是我在课堂上声明主键的方式:
@Id @Column(name = "id") @GeneratedValue(strategy=GenerationType.AUTO) private int id;
每个表调用一次SQL查询,将序列设置为下一个空闲数:
SELECT setval('tblname_id_seq', max(id)) FROM tblname;
tblname
是表的实际名称。
Hibernate可能使用不同的命名约定,或者序列可能已重命名。 如果找不到serial
列后面的serial
,请查看( 每个文档 ):
SELECT pg_get_serial_sequence(tblname, column_name)
更多细节:
修改Django AutoField的起始值
如何将CSV导入已经分配了ID的postgresql?
这里的问题可能是您将id声明为原语而不是包装器。
所以代替:
private int id;
你应该有:
private Integer id;
当您创建id初始化为0的实体时,而不是NULL。
这就是为什么你会得到重复的id约束违例exception。
只有当id为NULL时,AUTO生成策略才会将id赋值委托给数据库。
- hibernate-validator中的exception。 嵌套exception是java.lang.NoClassDefFoundError:ConfigurationImpl
- 如何强制Hibernate返回空值而不是null?
- Spring数据JPA:在结果元组中找不到别名! 执行自定义查询时出错
- persistence.xml从.properties文件导入数据库参数值
- Hibernate HQL连接提取不是递归提取
- GenericJDBCException:无法打开连接..由javax.resource.ResourceException引起:IJ000459:事务处于非活动状态
- JPA 2.0 Hibernate @OneToMany + @MapKeyJoinColumn
- 什么是Hibernate中的级联?
- hibernate c3p0破管