在利用hibernate做ORM时,如果对于hbm文件的属性,在java的pojo类中没有对应的get和set方法,则会产生如下异常:
java 代码
- Caused by: org.hibernate.PropertyNotFoundException: Could not find a getter for auditInfos
- in class EventType
- at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:282)
- at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:275)
- 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 代码
- private static Method getterMethod(Class theClass, String propertyName) {
-
- Method[] methods = theClass.getDeclaredMethods();
- for (int i=0; i
-
- if ( methods[i].getParameterTypes().length==0 ) {
- String methodName = methods[i].getName();
-
-
- 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];
- }
-
- }
-
-
-
-
- if ( methodName.startsWith("is") ) {
- String testStdMethod = Introspector.decapitalize( methodName.substring(2) );
- String testOldMethod = methodName.substring(2);
- if ( testStdMethod.equals(propertyName) || testOldMethod.equals(propertyName) ) {
- return methods[i];
- }
- }
- }
- }
- return null;
- }
这里methodName的值为getETypeName,propertyName的值为eTypeName,利用java.beans.Introspector进行对第一个字母的小写化操作得到testStdMethod,去掉get得到的是testOldMethod。
但是问题就出来了,前者的小写操作是有前提的,根据源码可知:
java 代码
- public static String decapitalize(String name) {
- if (name == null || name.length() == 0) {
- return name;
- }
- if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
- Character.isUpperCase(name.charAt(0))){
- return name;
- }
- char chars[] = name.toCharArray();
- chars[0] = Character.toLowerCase(chars[0]);
- return new String(chars);
- }
对于第一个字符和第二个字符都是大写的情况下,则返回的是原来的字符,因此在这种情况下,去掉get的ETypeName在decapitalize之后仍然是ETypeName,所以两者都得到的是ETypeName,而不再执行第14行代码,所以private static Method getterMethod(Class theClass, String propertyName)得到的是null,因此会产生对于某某属性找不到get方法的异常出来。
解决办法可以将getETypeName改成geteTypeName,或者干脆将属性名改成ETypeName。
分享到:
相关推荐
在此示例中,`name`属性将以模糊查询的方式进行比较,`ignoreCase()`方法则确保查询不区分大小写。 ##### 3. 在关联对象上放置条件 `Example`还可以用于查询具有关联关系的对象。假设`Cat`类与`Mate`类之间存在一...
在Hibernate的实体类中,我们需要为大字段定义对应的属性,并在ORM映射文件(如.hbm.xml)或使用注解进行配置。 1. 使用注解配置: ```java @Entity public class EntityWithLargeField { @Lob private String ...
在实体类中定义Clob类型的属性,并在Hibernate映射文件中相应配置。这样可以避免一次性加载整个Clob内容到内存,从而降低内存消耗。 4.1 基本配置: 4.1.1 实体类: 在实体类中,声明一个Clob类型的属性,例如: ``...
在本项目中,"Spring+Hibernate写的登录小例子" 是一个使用了两种流行Java框架——Spring和Hibernate——构建的简单登录应用。这个示例旨在帮助初学者理解如何整合这两个强大的框架来实现用户登录功能,同时也涉及到...
【标题】:在Myeclipse中搭建的Hibernate小程序 【正文】: Hibernate是一个强大的Java对象关系映射(ORM)框架,它简化了数据库与Java应用之间的数据交互。本项目是利用Myeclipse集成开发环境搭建的一个简单示例,...
在Java的持久化框架Hibernate中,注解是用于简化对象关系映射(ORM)配置的重要工具。以下是对几个关键注解的详细解释: 1. **@Entity**: 此注解用于标记一个Java类为实体Bean,这意味着这个类的实例将会被持久化到...
然而,由于其内部的映射和对象创建过程,对于大量数据操作,Hibernate可能会比JDBC慢一些,尤其是在使用Iterator遍历大数据集时。 在性能方面,JDBC通常在数据读写速度上占有优势,特别是当使用批处理时。而...
在Hibernate中配置c3p0,我们需要在Hibernate的配置文件(如hibernate.cfg.xml)中指定c3p0的相关属性,例如初始化连接数、最大连接数、空闲超时时间等。 另一个连接池实现是**Proxool**。Proxool也是一个开源的...
13. HQL与JPQL章节,详细说明了Hibernate查询语言(HQL)和Java持久化查询语言(JPQL)的语法、大小写敏感性、不同类型的语句(Select、Update、Delete、Insert)以及FROM子句的各种用法。还包括表达式的讲解,例如...
【标题】"JAVA+STRUTS+HIBERNATE写的小项目"是一个基于Java技术栈的Web应用程序,它利用了STRUTS框架和HIBERNATE ORM(对象关系映射)工具来构建。这个项目旨在为初学者提供一个实践平台,帮助他们理解和掌握这些...
【hibernate面试题2】涉及了许多关于Hibernate框架的核心知识点,包括检索策略、...理解并掌握这些知识点对于理解和优化Hibernate的应用至关重要,也是面试中常见的问题,能帮助求职者展示其在持久化领域的专业水平。
Struts和Hibernate是两种在Java Web开发中广泛使用的开源框架,它们在构建高效、可维护的Web应用程序中扮演着重要角色。本项目"struts+hibernate基于购物车的功能小demo"是一个实用的学习资源,旨在帮助初学者理解并...
在Java开发中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。为了使Hibernate能更好地适应不同项目的需求,开发者可以通过配置一系列参数来调整其行为。以下是关于Hibernate参数配置的...
7. **HQL查询规范**:HQL语句本身不区分大小写,但涉及的类名和属性名需要区分大小写,确保查询的准确性。 8. **数据传输对象(DTO)的使用**:在非分布式环境中,可以直接使用Entity对象作为数据传输,无需额外...
描述中还提到"其中的一个例子有点问题没解决",这可能是关于特定代码或配置的疑问,但在这里我们主要聚焦于理解Hibernate的基本工作原理。 **标签解析** "hibernate"标签直接指出了讨论的主题,ORM框架Hibernate。...
在本文中,我们将深入探讨如何入门使用Hibernate,一个流行的Java对象关系映射(ORM)框架。Hibernate允许开发者将Java对象模型直接映射到数据库表,从而简化数据访问和管理。以下是一个简单的步骤来创建和运行一个...
Struts、Spring 和 Hibernate 是 Java 开发中三大主流框架,它们各自解决 J2EE 开发中的不同问题。Struts 用于 MVC(Model-View-Controller)架构,Spring 提供全面的依赖注入(DI)和面向切面编程(AOP),而 ...
在IT行业中,数据库的扩展性和高可用性是关键问题,Mycat作为一款开源的分布式数据库中间件,为解决这些问题提供了方案。而Hibernate作为Java领域内的一个流行持久层框架,它简化了数据库操作,使开发者能更专注于...
Hibernate是一个强大的对象关系映射(ORM)框架,它能够将Java对象映射到数据库中的记录,并管理这些记录的生命周期。为了确保Hibernate能够正确地工作,我们需要在`hibernate.cfg.xml`文件中进行一系列的配置。本文...
SpringMVC是Spring框架的一部分,用于构建高效、灵活的Web应用程序,而Hibernate5则是一个强大的对象关系映射(ORM)框架,简化了数据库操作。接下来,我们将深入探讨这两个框架的基本配置和它们在项目中的结合使用...