mysql保存提示 HHH000315:Batch update returned unexpected row count from update: 1 actual row count: 0 ex

最近在将之前的项目(oracle)数据库切换成mysql,其他几个模块切换都很顺利,但是到了另外一个项目,就出现Batch update returned unexpected row count from update: 0 actual row count: 0 expecte这种问题,说一下我的解决流程,因为报错的时候一直提示是orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:657) 是关于事务提交的,这就说一下Hibernate的提交,首先呢是有一张主表,一张附表,关系可能是一对多,主表的外键呢在附表中关联,Hibernate的操作我看sql执行的执行顺序是先将两张表执行inster语句,然后执行update语句,进行外键的修改,具体打印的的方式可以修改log4j.properties

log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
log4j.loggerorg.hibernate.type.descriptor.sql.BasicExtractor=TRACE
log4j.logger.org.hibernate.engine.QueryParameters=DEBUG
log4j.logger.org.hibernate.engine.query.HQLQueryPlan=DEBUG

这样 就会显示打印执行sql语句时候的参数,当然,首先需要打印sql,在配置文件中开启sql的打印(appconfig.properties)

hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.hbm2ddl.auto=none

上述配置完成后,会清晰的看到sql语句和sql的参数,一开始以为是再做更新的时候,数据没有提交到数据库,再执行update语句的时候没有获取到要求改的主键,所以导致在修改的时候,提示Batch update returned unexpected row count from update: 1 actual row count: 0 ex,要修改一条实际返回0条被修改,其实并不是,都知道在使用mysql的时候,mysql的连接后面要跟上一大串的配置例如这样:

useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true&useAffectedRows=true

知道我在问遍度娘之后,偶然间看到要修改mysql的配置,然后我就做了修改

rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull

然后就可以了

是不是很神奇,我对两种配置做了比较,排除相同的配置,我把不同的做了如下举例,并查询其意思

useUnicode=true& 跟  characterEncoding=utf8& 连用

characterEncoding=utf8& :解决读取数据库产生的数据乱码的问题,从数据库读数据和写数据时MySQL的默认编码非UTF8编码,需要设置字符集编码为utf8。

useSSL=false& :  原因是MySQL在高版本需要指明是否进行SSL连接,我用的是5.7版本,所以就屏蔽掉了

serverTimezone=GMT%2B8& : 用于解决java应用比数据库时间早的问题,出现这种情况是因为mysql-connector-java  依赖没有指定版本,在mysql升级到8.0之后,驱动包跟之前不一样了,默认时区是全球统一时间 (UTC),北京时间是 UTC+8,解决办法就是设置成为上海的时区就行

allowMultiQueries=true&

useAffectedRows=true
默认值: 不使用受影响的行的数量进行返回,而是返回找到的行的数量值
具体场景:当该值是false时,执行【UPDATE】语句,在该【UPDATE】的条件下可以找到3条记录,但是实际上只更新了2条数据,因为第三条数据将要修改的值与原来的值相同,则该【UPDATE】语句会返回3、而有时候我们希望他返回2、则设置该参数值为 TRUE
从哪个版本开始有这个参数:5.1.7

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

rewriteBatchedStatements=true& MySQL的JDBC连接的url中要加rewriteBatchedStatements参数,并保证5.1.13以上版本的驱动,才能实现高性能的批量插入。
MySQL JDBC驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,批量插入实际上是单条插入,直接造成较低的性能。
只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL
另外这个选项对INSERT/UPDATE/DELETE都有效


useUnicode=true& 跟  characterEncoding=utf8& 连用

characterEncoding=UTF-8& :解决读取数据库产生的数据乱码的问题,从数据库读数据和写数据时MySQL的默认编码非UTF8编码,需要设置字符集编码为utf8。

zeroDateTimeBehavior=convertToNull  0datetime反应

具体的到底是那个配置出现的问题,我没有做继续的深究,还请 知道的大神可以 指点一下小弟

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值