hibernate3 @Id 与 @Column位置的问题

最近在做项目的过程中,遇到了一个很奇怪的问题,开始以为是hibernate3的一个bug,后来发现有规律可循。记录如下:

数据库表中定义了一个字段:MYHELLO_WORLD

hibernate对象类HelloWorld.java中ID和这个字段定义如下:
hibernate3 @Id 与 @Column位置的问题

结果运行的时候一直报错,提示 “标识符my_hello_world” 无效。找遍整个系统都没有找到my_hello_world 这个东西出现在什么地方。想了半天原来hibernate根据get方法的名称,每个大写字母都会转化为一个下划线,因此方法名getMyHelloWorld会被转化为 my_hello_world 。

又做了测试,如果把get,set方法名改成:getMyhelloWorld,setMyhelloWorld,运行正常。
又做了测试,把@Column放到get方法上,发现无论属性名和get方法的名称是什么都不会报错:
hibernate3 @Id 与 @Column位置的问题

又做了测试,把@Id放到属性名称上:
hibernate3 @Id 与 @Column位置的问题

进行上面的测试,发现当@Column放在属性名称上时,无论get方法名称是什么都不会报错,当@Column放在get方法上时,会根据get方法的名称把每个大写字母转化为一个下划线。

又做了测试:
把数据库字段名称的下划线去掉,改成MYHELLOWORLD,然后进行上面的测试,发现结果是一样的。因此可以总结如下:

(1)如果@Id写在属性名称上,就以属性上写的@column为准,如果没有写,就以get方法名称为准,每个大写字母转化为一个下划线;
(2)如果@Id写在get方法上,就以get方法上的@Column为准,如果get方法上没有@column,就以方法名称为准,每个大写字母转化为一个下划线。

注意:以上测试是在hibernate3上进行的。有空看下其他版本的hibernate是否有类似的问题。