前两天在现网出现了一个问题,在添加一个企业时报错,重复的主键XXX,而且不只一台机器。
在数据库中查了一下,确实这个主键是用过的。问题确认,但为什么会插入了个重复主键呢?
我们这部分用的是 Hibernate,是 Hibernate 用了一个已经用过的主键向数据库中插数据。但这里一直用得好好的,为什么突然又报错了呢?重启应用程序就全恢复正常了。
经过详细询问,出问题的这两台机器有一个共同点,都手动向数据库中插入过数据。其它没有做过此操作的系统都正常。估计就是这个原因。
于是测试了一下,先运行系统,然后在系统添加,再手动添加,然后再系统添加,果然,报错了,重复的主键。确定了是 Hibernate 的问题。
找比较懂 Hibernate 的同事帮着查了一下 Hibernate 的文档,当 ID 的自动增加方式设置为 increment 的时候,Hibernate 会把下几个未用的主键先读入内存,当插入时,从内存中取值。所以数据库如果不是通过 Hibernate 插入数据时,Hibernate 内存中的主键值并不更新。再通过 Hibernate 插入时就重复主键了。
解决方法是把 Hibernate 映射文件中的主键增长方式设为 identity。这种方式会在每次插入时都从数据库中取一个主键。
increment 适用于简单的只有一个应用会往数据库中插数据的方式,当同一时间有多个应用在操作数据库时,应当使用 identity 方式。当然,效率一定是 increment 方式高,所以使用时也要根据应用来确定。
同时,发现 Eclipse 的 Hibernate Synchronizer 插件很好用,自动生成代码很不错,有时间玩玩儿,现在太忙,没时间。
阅读(1476) | 评论(0) | 转发(0) |