问题:ERROR [org.hibernate.util.JDBCExceptionReporter] - <Duplicate entry '466' for key 'PRIMARY'>
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
环境:程序中原来有一个地方在保存数据时,使用的是Hibernate自带的save方法保存,后面我在别的地方需要新增数据时,直接通过insert语句进行插入的。 数据中的主键为int型、自增。
情况:insert语句的插入没有问题,但是save时会出现上述Exception,操作失败
原因:hibernate中设置的主键方式错误(原来设置的是主键类型为increment,由于我这里用的是mysql数据库,改为identity后正常)
第一眼看见这个异常以为是数据库的自增主键有问题了,然后在数据库中查了一下Auto_increment的值是正常的;然后赶快去检查了自己的代码,调试了半天也没有发现问题;在网上根据这个异常来搜索,发现也都和自己遇到的情况不符。继续看代码,看看是不是save的时候有问题,纠结了半天,突然去看了一下hibernate的配置文件(灵光一闪),看到了主键设置的是increment。在网上找了一下,才发现increment的确存在问题。
“increment”
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。
“identity”
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。
“native”
由Hibernate根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。 在HIBERNATE配置中native是默认的,泛指的自增,也就是说除了oracle数据库外(oracle下用native需要用到一个叫hibernate_sequence的sequence),大部分数据库你都可以使用默认的native来代表自增。