我遇到了删除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设置,以便将来可以避免这些问题
答案 0 :(得分:0)
我记得我曾经在每个mysql会话开始时调用SET CHARACTER SET'utf-8'`。那是在PHP中。现在Hibernate / JDBC应该处理它,但你仍然需要在服务器和客户端上设置它。
请参阅the server config和JDBC config。
您需要将数据库,连接和客户端编码全部对齐
编辑:另请注意,表格和列可能有自己的编码,因此请在INFORMATION_SCHEMA
中查看。
此外,我还建议观看MySQL服务器日志,我相信这些日志会告诉您他们执行查询失败,或者警告无效值。