BUG:Hibernate主键类型问题

问题: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来代表自增。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值