hibernate下两个相连大写字符导致Could not find a getter for问题

本文探讨了在使用Hibernate框架时GETSET方法的命名规则及其常见问题。详细解释了JavaBean规范对方法命名的要求,以及如何避免因命名不当导致的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发现这个问题你就要注意你的命名了 在实体类里

HIBERNATE问题

1.GET SET方法 要不都是小写 2.不能出现第2个字母是大写 或者 出现两个字母大写的 3.要不第一个大写其他小写

如果我们在HBM.XML中定义
java代码:


<property name="xSize" type="float"/>

在创建Session的时候会告诉你Could not find a getter for xSize
经过Debug看了一下发现不是Hibernate的问题
Hibernate用的方法是
java代码:


BasicPropertyAccessor.java
String methodName = methods[i].getName();
// try "get"
if( methodName.startsWith("get") ) {
String testStdMethod = Introspector.decapitalize(methodName.substring(3) );
String testOldMethod = methodName.substring(3);
if( testStdMethod.equals(propertyName) || testOldMethod.equals(propertyName) ) return methods[i];
}

他调用的是
Introspector.decapitalize(String name);
Sun的注释说明
but in the (unusual) special case when there is more than one character and both the first and second characters are upper case, we leave it alone.
他得到getXSize这个方法名,substring[3]为XSize然后decapitalize之后不修改首位字符,就Could not find a getter for xSize了
这个是Java Bean的Spec里面规定的。方法有多种,你可以写成xsize这种全部小写,或者加"_"字符,如果你首位大写不在第二位就没问题了。

问=======================================================================题:org.hibernate.PropertyNotFoundException: Could not find a getter for attribute
A:这个问题表明:
1)getter()方法写错了,没有按照javaBean的规则写.
2)*.hmb.xml中的属性名和pojo中的是否一致.注意:属性名是否多了空格.
启示:.hbm.xml里的排列最好跟数据库表里的排列一样!最好不要乱改变位置!否则会出莫名其妙的错误!
3)字段的取名要注意。比如数据库中的字段为M_R_ID,映射到hbm.xml为mRId,那么产生的POJO也是mRId,自动产生的getter方法为:getMRId();相应的setter方法一致,这样就会抛出上面所述异常,这个应该是hibernate的模板格式问题。所以尽量要避免这样的命名。
解决方法:
1)换做getmRId(); 问题可解决,没有抛出异常,能取值。
2)修改数据库字段名。这个最好,不会产生以后的不确定因素。
Hibernate的FAQ里面也有记录,简单提到了这个问题

在spring+hibernate框架的java项目开发过程中,经常会遇到这样的错误:

could not find a getter for ... in class ...


可能原因如下:

1.真的没有写getter方法(发生几率:1%)

2.*.hmb.xml文件中的属性名和pojo不一致(*.hbm.xml和*.java没衔接好,不一致),字段属性没有正确配置,比如, *.hmb.xml中*.java的地址要明确(明确指出引用包的完整路径);映射错误;有多个主键时,对生成的联合主键配置错误;拼写错误(包括多空 格)等(发生几率:48%)

3.方法写错/方法名写错,要按照javabean的书写规范写啊,要不然打死也找不到哪儿错了(发生几率:50%)

这里提一下:get/set是不是不允许方法名中有连续两个大写字母,例如

public String getODPType(){

return this.oDPType;

}

public void setODPType(String oDPType){

this.oDPType = oDPType;

}

这样写它就会报错,报找不到getter for oDPType的错误,但下面这样写就可以了

public String odpType;

public String getOdpType(){

return this.odpType;

}

public void setOdpType(String odpType){

this.odpType = odpType;

}

4.其他不明原因(发生几率:1%)

 

 

这里说下我的问题:

原来的get方法是getPicId,报错了,修改成小写getpicid问题就解决了(set的方法也一样,不过报的是另一个错误。。),原因暂不明白- -

在导出 Excel 时,遇到错误 **"There is no getter for property named in"** 通常与 Java 类的字段命名以及对应的 getter 方法不匹配有关。该问题常出现在使用 Apache POI 或类似工具导出 Excel 的场景中,尤其是在字段命名不符合 JavaBean 规范的情况下。 --- ### 1. 命名规范问题 JavaBean 规范要求字段名以小写字母开头,且 getter 方法名遵循 `get` 或 `is`(针对布尔类型)加上字段名首字母大写的格式。如果字段命名不规范,例如使用全大写或不符合规范的命名方式,工具无法自动识别 getter 方法。 例如,以下字段命名可能导致问题: ```java private String N1; // 不符合命名规范 ``` 对应的 getter 方法应为: ```java public String getN1() { return N1; } ``` 如果缺少此 getter 方法,或者字段命名不规范,工具将抛出 **"There is no getter for property named 'N1'"** 错误[^2]。 --- ### 2. Lombok 注解影响 如果使用了 Lombok 的 `@Data` 注解,它会自动生成 getter 和 setter 方法。但需确保字段命名符合规范,否则即使使用了 `@Data`,生成的 getter 方法名也可能与预期不符。例如,字段名为 `user_id`,生成的 getter 方法应为 `getUserId()`,而非 `getUser_id()`,这可能导致工具无法识别。 ```java @Data public class Orders { private String user_id; // 字段命名可能引发问题 } ``` 建议将字段名改为符合驼峰命名规范的形式,如 `userId`,以确保生成的 getter 方法名与预期一致[^1]。 --- ### 3. 自定义注解与字段映射 如果使用了自定义注解(如 `@Excel`)来指定字段在 Excel 中的列名,需确保字段本身具有正确的 getter 方法,并且注解配置正确。例如: ```java @Excel(name = "姓名") private String N1; ``` 若 `N1` 字段缺少 `getN1()` 方法,或方法名拼写错误,同样会导致该错误。 --- ### 4. 解决方案与调试方法 #### 4.1 检查字段命名规范 确保字段名符合驼峰命名规范,例如 `userName` 而非 `user_name`,以避免生成的 getter 方法名与预期不符。 #### 4.2 显式编写 getter 方法 即使使用了 Lombok,也建议在必要时显式编写 getter 方法,以确保其命名正确。 ```java public String getUserId() { return userId; } ``` #### 4.3 使用 `@Accessors(chain = true)` 时的注意事项 如果使用了 `@Accessors(chain = true)` 注解,需确保生成的 getter 方法未被影响。在某些情况下,链式调用可能会影响字段访问方式,建议通过 `@Data` 生成的 getter 方法进行验证[^2]。 #### 4.4 打印类结构信息进行调试 可以通过反射打印类的字段和方法信息,检查是否存在预期的 getter 方法: ```java Method[] methods = Employee.class.getMethods(); for (Method method : methods) { System.out.println(method.getName()); } ``` #### 4.5 使用工具类验证字段映射 可以编写工具类验证字段与 getter 方法的匹配情况,确保所有字段都具有对应的 getter 方法。 ```java public static boolean hasGetter(Class<?> clazz, String fieldName) { String getterName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); try { Method method = clazz.getMethod(getterName); return method != null; } catch (NoSuchMethodException e) { return false; } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值