Hibernate坑之大小写敏感
发布于 13 Dec 2014
work summary

新来的测试,注册账号登陆后提示权限不足,发给我说让我有时间看看。我把收到的用户名密码粘贴到浏览器中进行登陆,果然提示没有权限。于是在本地debug了一下,发现用户的权限对象为空。然后把执行的sql放到数据库查询了下,发现在表中此用户是有关联的权限的。于是就郁闷了,找其他同事帮忙看了看。 调了半天,发现此账号在用户注册的时候首字母是大写的,即数据库中存储的数据是首字母大写。然而却用的是小写登陆。因为数据库查询设置的是大小写不敏感的,所以登陆是没有问题的。但是,通过首字母小写的主键ID查询到的user对象的主键ID,被“神奇”的设置成了首字母小写。而并没有按照数据库中存储的那样首字母大写。这就导致了user对象的主键是首字母小写,而从数据库中查询出的user的关联对象role的外键userId,却是按照数据库中的那样为首字母大写。这就导致了user对象的主键ID和role对象的外键Userid不一致,从而引发了上述的问题。

我们的解决办法也很简单,在用户注册时(save user)和登陆时(query user),统一把user id转换成小写,问题就解决了。因为靠用户输入的主键目前只有userId,所以其他应该没什么问题。前面,在输出hibernate的sql语句时想把参数也带出来。按网上的办法死活没起作用。最后看源码发现,在没指定log 的provider的情况下,log4j优先于logback.于是在maven中把 log4j exclude的掉,问题解决。