Could not execute JDBC batch update; bad SQL grammar [insert into

         最近维护别人的一个系统(该系统用spring+jpa+hibernate做到),因为生产数据库上的数据比测试环境多很多,就把生产上的数据insert into 到了测试库。后来把维护的功能点做好了,因为没有改动其他功能点代码,所有就没有去测试其他功能点。然后某一天测试说报错了,而且不是我改的地方报错,当时就郁闷了,后来调试跟踪就报了    Could not execute JDBC batch update; bad SQL grammar [insert into .....第一次遇见这样的问题,于是百度,各种说法,大体是 1.主要是配置文件设置了关联,数据却没有关联造成的,只要数据正确就没有问题。2.造成这个原因的还可能是数据库的驱动jar包不支持。3.新增数据时用了外键与其他表关联,没有同步新增数据.....

        以上的解决方案都没有解决我的问题,所有也就没有去考证以上的方法对错与否,不过以上解决问题的思路应该没错吧。后来排查到在java后台插入数据时在insert语句中的id(一个表的主键)用的是oracle数据库的一个序列,用断点调试的方法每走一次断点,id就自动加了一个1,如前文提到的,因为自己手动在数据库中插入了很多数据,所以我获取的id的值竟然和数据库中已有的id重复了,大抵可以判断oracle序列不是非常智能的去识别数据库中已有的序列,只是傻傻的做加1操作。于是就猜到了是自己单独把生产数据插入到测试数据,然后导致序列产生的id不一致所产生的,于是就写了 select seq_distrib_type.Nextval from dual 这样的一个语句执行到产生的id跟数据库中已有的id一致后再走程序,然后就通了。

        因此当产生 Could not execute JDBC batch update; bad SQL grammar [insert into .....这个错误时,有可能就是我出现的问题,插入了数据到一个通过oracle序列产生主键的表中,然后导致了序列产生的id和表中已有的数据id值重复了。

 

以下是java中部分代码

@Entity
@Table(name="netbank_distrib_type")
public class DistribType {

 @Id
 @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="dt_seq")
 @SequenceGenerator(name="dt_seq",sequenceName="seq_distrib_type",allocationSize=1)
 @Column(name="id")
 private Long id;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值