Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1935986
  • 博文数量: 219
  • 博客积分: 8963
  • 博客等级: 中将
  • 技术积分: 2125
  • 用 户 组: 普通用户
  • 注册时间: 2005-10-19 12:48
个人简介

文章分类

全部博文(219)

文章存档

2021年(1)

2020年(3)

2015年(4)

2014年(5)

2012年(7)

2011年(37)

2010年(40)

2009年(22)

2008年(17)

2007年(48)

2006年(31)

2005年(4)

分类: Java

2007-09-01 00:30:19

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