2014-05-22 23 views
1

在我的spring项目中,数据库中的表是由Hibernate使用我的实体类作为基础自动创建的,但我手动在表中插入了一些默认值(使用pgAdmin3)。手动更新用于在Hibernate中生成主键的计数器?

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

任何人都知道如何解决这个问题?

UPDATE

这就是我声明我的主键在我的课:

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

你使用什么样的列作主键? –

+0

我更新我的问题,以显示我如何声明我的主键 –

回答

3

呼叫每桌一旦这种SQL查询的顺序设置为下一个免费电话:

SELECT setval('tblname_id_seq', max(id)) FROM tblname; 

tblname是表的实际名称。

Hibernate可能会使用不同的命名约定,或者序列可能已被重命名。如果你不能找到serial柱后面的序列,请与(per documentation):

SELECT pg_get_serial_sequence(tblname, column_name) 

更多细节:
Modify Django AutoField start value
How to import a CSV to postgresql that already has ID's assigned?

+0

我在这里理解的是您的示例工程更新postgresql服务器中的此tblname_id_seq。但是我没有这个序列,我的主键只能由Hibernate处理。 –

+0

@KleberMota:序列号通常由RDBMS处理。每个“串行”列后面都有一个序列对象。按照指南的链接了解更多信息。我添加了一个方法来查找序列。 –

+0

hibernate_sequence是默认情况下hibernate使用的序列的名称。试着在pgAdmin3中查找这个序列,在上面的查询中使用它。 –

0

这里的问题可能是你声明的id原始而不是包装。

所以不是:

private int id; 

你应该有:

private Integer id; 

当您创建实体与ID被初始化为0,而不是空。

这就是为什么你会得到重复的id约束违例例外。

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

+0

我更新我的代码,将我的Id更改为整数,但仍然存在相同的问题(顺便说一句,实体未使用0初始化,而是使用数字序列中的最后一个数字 - 最后一个数字是9 - ,它与我通过程序插入的元素数量相匹配,因为我认为Hibernate有自己的计数器)。 –

+0

[根据Hibernate文档](http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch04.html#persistent-classes-pojo-identifier):“我们建议你在持久化类上声明一致命名的标识符属性,并且使用可空(即非基元)类型。“ –

+0

至于手动插入的默认值,请确保在插入时始终使用序列,并且不要手动分配值。最好将PRIMARY KEY设置为:id bigint NOT NULL DEFAULT nextval('my_table_sequence':: regclass) –