【问题标题】:Hibernate/mysql - Batch update returned unexpected row count and ascii charactersHibernate/mysql - 批量更新返回意外的行数和 ascii 字符
【发布时间】:2017-07-28 09:44:14
【问题描述】:

我在删除 hibernate 读取的实体时遇到问题。像从数据库中加载实体并立即删除实体而不进行任何更改的简单调用失败并出现异常

org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException:批量更新从更新[0]返回了意外的行数;实际行数:0;预期:1;嵌套异常是 org.hibernate.StaleStateException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预计:1

我最终将错误追溯到一个错误字符串,该字符串具有以下 ascii 字符 - 239 (0xef)、191 (0xbf) 和 189 (0xbd)。删除这些字符后,一切正常。由于 hibernate delete 调用在删除时匹配 where 子句中的所有字段,因此当字符串中存在这些字符时调用失败。

我们的设置中的字符编码似乎存在问题,因为 hibernate 返回的实体/列不能用作条件中 where 子句的一部分 - 或者在翻译中丢失了某些内容。

我应该怎么做 - mysql setup 或 hibernate setup 这样以后可以避免这些问题

【问题讨论】:

    标签: mysql hibernate


    【解决方案1】:

    我记得我曾经在每个 mysql 会话开始时调用 SET CHARACTER SET 'utf-8'`。那是在 PHP 中。现在 Hibernate / JDBC 应该可以处理这个问题,但您仍然需要在服务器和客户端上进行设置。

    参见the server configJDBC config

    您需要将数据库、连接和客户端编码全部对齐。
    编辑: 另请注意,表和列可能有自己的编码,因此请在INFORMATION_SCHEMA.

    此外,我还建议您查看 MySQL 服务器日志,我相信它们会告诉您他们未能执行查询,或者可能会警告无效值。

    【讨论】:

      猜你喜欢
      • 2016-07-17
      • 2014-02-03
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 2020-09-27
      • 1970-01-01
      相关资源
      最近更新 更多