`
chillwarmoon
  • 浏览: 155346 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

分析Hibernate在做ORM中的属性大小写的问题

阅读更多

在利用hibernate做ORM时,如果对于hbm文件的属性,在java的pojo类中没有对应的get和set方法,则会产生如下异常:

java 代码
  1. Caused by: org.hibernate.PropertyNotFoundException: Could not find a getter for auditInfos    
  2. in class EventType   
  3. at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:282)   
  4. at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:275)   
  5. at org.hibernate.mapping.Property.getGetter(Property.java:272)  

但是今天遇到了一种情况,就是写上某个属性的get和set方法时,同样会出现该异常,该pojo的属性是eTypeName则对应的方法名称为getETypeName();跟踪hibernate的堆栈报错信息,查找到:

org.hibernate.property.BasicPropertyAccessor.createGetter的private static Method getterMethod(Class theClass, String propertyName)方法,其中对于get的处理逻辑是这样的:

java 代码
  1. private static Method getterMethod(Class theClass, String propertyName) {   
  2.   
  3.     Method[] methods = theClass.getDeclaredMethods();   
  4.     for (int i=0; i
  5.         // only carry on if the method has no parameters   
  6.         if ( methods[i].getParameterTypes().length==0 ) {   
  7.             String methodName = methods[i].getName();   
  8.   
  9.             // try "get"   
  10.             if ( methodName.startsWith("get") ) {   
  11.                 String testStdMethod = Introspector.decapitalize( methodName.substring(3) );   
  12.                 String testOldMethod = methodName.substring(3);   
  13.                 if ( testStdMethod.equals(propertyName) || testOldMethod.equals(propertyName) ) {   
  14.                     return methods[i];   
  15.                 }   
  16.   
  17.             }   
  18.   
  19.             // if not "get" then try "is"   
  20.             /*boolean isBoolean = methods[i].getReturnType().equals(Boolean.class) ||  
  21.                 methods[i].getReturnType().equals(boolean.class);*/  
  22.             if ( methodName.startsWith("is") ) {   
  23.                 String testStdMethod = Introspector.decapitalize( methodName.substring(2) );   
  24.                 String testOldMethod = methodName.substring(2);   
  25.                 if ( testStdMethod.equals(propertyName) || testOldMethod.equals(propertyName) ) {   
  26.                     return methods[i];   
  27.                 }   
  28.             }   
  29.         }   
  30.     }   
  31.     return null;   
  32. }  

这里methodName的值为getETypeName,propertyName的值为eTypeName,利用java.beans.Introspector进行对第一个字母的小写化操作得到testStdMethod,去掉get得到的是testOldMethod。

但是问题就出来了,前者的小写操作是有前提的,根据源码可知:

java 代码
  1.    public static String decapitalize(String name) {   
  2. if (name == null || name.length() == 0) {   
  3.     return name;   
  4. }   
  5. if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&   
  6.         Character.isUpperCase(name.charAt(0))){   
  7.     return name;   
  8. }   
  9. char chars[] = name.toCharArray();   
  10. chars[0] = Character.toLowerCase(chars[0]);   
  11. return new String(chars);   
  12.    }  

对于第一个字符和第二个字符都是大写的情况下,则返回的是原来的字符,因此在这种情况下,去掉get的ETypeName在decapitalize之后仍然是ETypeName,所以两者都得到的是ETypeName,而不再执行第14行代码,所以private static Method getterMethod(Class theClass, String propertyName)得到的是null,因此会产生对于某某属性找不到get方法的异常出来。

解决办法可以将getETypeName改成geteTypeName,或者干脆将属性名改成ETypeName。

分享到:
评论
5 楼 chillwarmoon 2007-06-15  
如果要符合javabean规范,则只能将eTypeName改成ETypeName,把getter方法改成geteTypeName只是一个tricky的做法。
4 楼 chillwarmoon 2007-06-15  
楼上说的没错,但是我说的情况是属性名称第一个字母小写,第二个字母大写,例如:eTypeName,则按照javabean specification规定的getter方法为getETypeName,则会出现找不到getter方法的错误。
今天看了一下javabean specification,规定了一般的属性名称首字母小写,如果遇到前两个字母大写的属性,则getter方法保持属性名称不变,例如URL属性的getter方法为getterURL,但是并没有规定类似eTypeName这样的属性的getter方法写成geteTypeName的形式。
3 楼 magice 2007-06-15  
标准的javabean规范是要求
属性第一个字母小写 如:abcDef
相应属性的方法  getAbcDef()
              setAbcDef()
另外,eclipse的代码自动补全功能会自动为你生成符合规范的JavaBean的:)
2 楼 chillwarmoon 2007-06-10  
不好意思,没注意。呵呵
1 楼 downpour 2007-06-10  
和Hibernate有什么关系,这是JavaBean的规范。好好读读JavaBean的规范。

相关推荐

    Hibernate中Example的用法

    在此示例中,`name`属性将以模糊查询的方式进行比较,`ignoreCase()`方法则确保查询不区分大小写。 ##### 3. 在关联对象上放置条件 `Example`还可以用于查询具有关联关系的对象。假设`Cat`类与`Mate`类之间存在一...

    hibernate中处理大字段 网上收集的文档

    在Hibernate的实体类中,我们需要为大字段定义对应的属性,并在ORM映射文件(如.hbm.xml)或使用注解进行配置。 1. 使用注解配置: ```java @Entity public class EntityWithLargeField { @Lob private String ...

    关于Oracle的 Clob数据类型在Hibernate中的应用小结

    在实体类中定义Clob类型的属性,并在Hibernate映射文件中相应配置。这样可以避免一次性加载整个Clob内容到内存,从而降低内存消耗。 4.1 基本配置: 4.1.1 实体类: 在实体类中,声明一个Clob类型的属性,例如: ``...

    Spring+Hibernate写的登录小例子

    在本项目中,"Spring+Hibernate写的登录小例子" 是一个使用了两种流行Java框架——Spring和Hibernate——构建的简单登录应用。这个示例旨在帮助初学者理解如何整合这两个强大的框架来实现用户登录功能,同时也涉及到...

    在Myeclipse中搭建的一个Hibernate小程序

    【标题】:在Myeclipse中搭建的Hibernate小程序 【正文】: Hibernate是一个强大的Java对象关系映射(ORM)框架,它简化了数据库与Java应用之间的数据交互。本项目是利用Myeclipse集成开发环境搭建的一个简单示例,...

    hibernate注解中的名词解释

    在Java的持久化框架Hibernate中,注解是用于简化对象关系映射(ORM)配置的重要工具。以下是对几个关键注解的详细解释: 1. **@Entity**: 此注解用于标记一个Java类为实体Bean,这意味着这个类的实例将会被持久化到...

    JDBC与Hibernate区别

    然而,由于其内部的映射和对象创建过程,对于大量数据操作,Hibernate可能会比JDBC慢一些,尤其是在使用Iterator遍历大数据集时。 在性能方面,JDBC通常在数据读写速度上占有优势,特别是当使用批处理时。而...

    hibernate连接池驱动

    在Hibernate中配置c3p0,我们需要在Hibernate的配置文件(如hibernate.cfg.xml)中指定c3p0的相关属性,例如初始化连接数、最大连接数、空闲超时时间等。 另一个连接池实现是**Proxool**。Proxool也是一个开源的...

    Hibernate5用户手册中文版

    13. HQL与JPQL章节,详细说明了Hibernate查询语言(HQL)和Java持久化查询语言(JPQL)的语法、大小写敏感性、不同类型的语句(Select、Update、Delete、Insert)以及FROM子句的各种用法。还包括表达式的讲解,例如...

    JAVA+STRUTS+HIBERNATE写的小项目

    【标题】"JAVA+STRUTS+HIBERNATE写的小项目"是一个基于Java技术栈的Web应用程序,它利用了STRUTS框架和HIBERNATE ORM(对象关系映射)工具来构建。这个项目旨在为初学者提供一个实践平台,帮助他们理解和掌握这些...

    hibernate面试题2

    【hibernate面试题2】涉及了许多关于Hibernate框架的核心知识点,包括检索策略、...理解并掌握这些知识点对于理解和优化Hibernate的应用至关重要,也是面试中常见的问题,能帮助求职者展示其在持久化领域的专业水平。

    struts+hibernate基于购物车的功能小demo

    Struts和Hibernate是两种在Java Web开发中广泛使用的开源框架,它们在构建高效、可维护的Web应用程序中扮演着重要角色。本项目"struts+hibernate基于购物车的功能小demo"是一个实用的学习资源,旨在帮助初学者理解并...

    hibernate参数配置

    在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。为了使Hibernate能更好地适应不同项目的需求,开发者可以通过配置一系列参数来调整其行为。以下是关于Hibernate参数配置的...

    Hibernate最佳实践

    7. **HQL查询规范**:HQL语句本身不区分大小写,但涉及的类名和属性名需要区分大小写,确保查询的准确性。 8. **数据传输对象(DTO)的使用**:在非分布式环境中,可以直接使用Entity对象作为数据传输,无需额外...

    Hibernate的小例子

    描述中还提到"其中的一个例子有点问题没解决",这可能是关于特定代码或配置的疑问,但在这里我们主要聚焦于理解Hibernate的基本工作原理。 **标签解析** "hibernate"标签直接指出了讨论的主题,ORM框架Hibernate。...

    Hibernate入门之自己写的小例子的总结

    在本文中,我们将深入探讨如何入门使用Hibernate,一个流行的Java对象关系映射(ORM)框架。Hibernate允许开发者将Java对象模型直接映射到数据库表,从而简化数据访问和管理。以下是一个简单的步骤来创建和运行一个...

    Struts+spring+hibernate整合成功小实例

    Struts、Spring 和 Hibernate 是 Java 开发中三大主流框架,它们各自解决 J2EE 开发中的不同问题。Struts 用于 MVC(Model-View-Controller)架构,Spring 提供全面的依赖注入(DI)和面向切面编程(AOP),而 ...

    Hibernate连接Mycat例子详解

    在IT行业中,数据库的扩展性和高可用性是关键问题,Mycat作为一款开源的分布式数据库中间件,为解决这些问题提供了方案。而Hibernate作为Java领域内的一个流行持久层框架,它简化了数据库操作,使开发者能更专注于...

    hibernate[1].cfg.xml中配置信息详解

    Hibernate是一个强大的对象关系映射(ORM)框架,它能够将Java对象映射到数据库中的记录,并管理这些记录的生命周期。为了确保Hibernate能够正确地工作,我们需要在`hibernate.cfg.xml`文件中进行一系列的配置。本文...

    SpringMVC+Hibernate5 项目配置Demo

    SpringMVC是Spring框架的一部分,用于构建高效、灵活的Web应用程序,而Hibernate5则是一个强大的对象关系映射(ORM)框架,简化了数据库操作。接下来,我们将深入探讨这两个框架的基本配置和它们在项目中的结合使用...

Global site tag (gtag.js) - Google Analytics