最近看到别人一个小的系统中,数据库表中主键设置成了varchar,同时在hibernate中设置了主键increment自增的属性;然后在系统中删除了几条数据,然后再插入数据是出现了entry duplicate column 的问题错误。
分析一下,mysql中该表设置了主键,但是主键类型是varchar类型,心想可能可表中数据有关系,于是与就查看了它数据库表中数据,其中ID是1,2,5,6,7,8,9,10,13 等等,
而当前插入数据提示entry duplicate ‘5’ 处理问题,也可能就是插入实体,其主键为5的,不允许插入。这可能与varchar类型有关,因为hibernate设置了该主键自增,可能他查询会按照varchar来排序,一看3,4没有,那插入时可能就会插入主键为3,为4的,结果到了5,因为数据库表中已经存在了5的主键,所以提示出现了错误。为了验证这个东西,继续往里面插入数据,如果有entry duplicate ‘6’ ,7,8,9,10 的错误提示,同时到11,12 却没有错误出现,13又出现,可可以证明吧。这个同时应该和每次启动服务,也有关系,每次启动服务器后,猜想hibernate肯定会读一次当前的主键值,然后再插入时会在此基础上计算的。因此就会出现这样的错误。
自己窃喜,这算不算hibernate的一个bug。但是如果换成是int的主键,则应该不会出现这样的问题,为此又做了实验,将该数据类型该为int,ID仍旧是1,2,5,6,7,8,9,10,13
这次则是在mysql中没有出现这样的问题,是直接在最大数据ID基础上往上累加的。不知道在其他数据库上,hibernate使用会不会出现这样的问题。记录仅供参考。