Hibernate / mysql - 批量更新返回意外的行数和ascii字符

时间:2017-03-08 00:34:56

标签: mysql hibernate

我遇到了删除hibernate读取的实体的问题。一个简单的调用,比如从数据库加载实体并立即删除实体而没有任何改变,但是没有异常

  

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

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

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

我应该怎么做 - mysql设置或hibernate设置,以便将来可以避免这些问题

1 个答案:

答案 0 :(得分:0)

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

请参阅the server configJDBC config

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

此外,我还建议观看MySQL服务器日志,我相信这些日志会告诉您他们执行查询失败,或者警告无效值。