今天遇到一个hibernate的问题,有一个实体的主键字段叫userId,数据库里的字段名称是user_id。
然后在某个查询语句里有这样一段代码:
Criterion criterion = Restrictions.eq("id",userId);
User user=userDao.findUnique(criterion);
当时看到这段代码的感觉是应该会报错吧,因为这个实体并没有id这个字段,然而事实是不仅可以运行,结果还是正确的。
搜索了下网络,发现有网友遇到类似的问题,但是没有找到问题的原因。原帖如下:
跟踪了一下hibernate的源代码,发现在hibernate启动生成映射关系的时候,会先初始化普通字段的映射关系,再初始化主键字段的映射关系,如下图所示:
而这种主键字段的初始化,也就是initIdentifierPropertyPaths(mapping)这个方法,不仅会生成userId->user_id的映射关系,还会生成一条id->user_id到映射关系。
至此,问题的原因已经明朗了,我遇到的问题是因为hibernate自动生成了id的映射,所以可以访问到id属性。而网友的问题则是,hibernate第二步自动生成的id映射关系覆盖了第一步普通属性里id的映射关系。