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

spring jdbctemplate 实体属性映射值为null

    博客分类:
  • java
阅读更多

今天在做mysql和derby数据迁移的时候出现个问题.实体的某些属性经常获取不到值.总是为null

方法如下:

 

 public List<Test1> getTestAll() {
        String sql = "select * from Test";
        List<Test1> l = null;
        try {
            l = getSimpleJdbcTemplate().query(sql,
                    ParameterizedBeanPropertyRowMapper.newInstance(Test.class),
                    new Object[]{});
        } catch (DaoException e) {
            logger.error(e);
            throw e;
        }
        return l;
    }

 

 

 下图为test表的字段


 

 

下面是数据库对应的实体文件Test

 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Integer id;
    @Column(name = "T_CurTag")
    private String tCurTag;
    @Column(name = "R_IsDel")
    private Integer rIsDel;
    @Column(name = "CPicPath")
    private String cPicPath;
    //get set方法省略...

 

实体文件使用hibernate jpa生成的

 

 

方法执行完毕之后.返回的list中取出实体对象test发现.

tCurTag,rIsDel值都为null.

很纳闷.自己瞅瞅几个字段区别也就在大小写和下划线了.

于是乎改了改.

数据库的字段变成了

T_Curtag,R_Isdel         正确

T_Cur_Tag,R_Is_Del    正确

TCurTag,RIsDel            正确

 

通过研究发现..java的命名规范还是有用的.

如果命名为

T_CurTag那么生成的属性就是tCurTag.通过看spring jdbctemplate的源码发现.

如果属性的名称不符合java的规范(还是jdbc的规范?)则会造成属性值映射失败的现象

 

首先根据这句

 

 ParameterizedBeanPropertyRowMapper.newInstance(Test1.class),

 

 查看其源码:

 

public static <T> ParameterizedBeanPropertyRowMapper<T> newInstance(Class<T> mappedClass) {
		ParameterizedBeanPropertyRowMapper<T> newInstance = new ParameterizedBeanPropertyRowMapper<T>();
		newInstance.setMappedClass(mappedClass);
		return newInstance;
	}
 

 

继续找这句

 

newInstance.setMappedClass(mappedClass);
 

 

 

 

         /**
	 * Set the class that each row should be mapped to.
	 */
	public void setMappedClass(Class mappedClass) {
		if (this.mappedClass == null) {
			initialize(mappedClass);
		}
		else {
			if (!this.mappedClass.equals(mappedClass)) {
				throw new InvalidDataAccessApiUsageException("The mapped class can not be reassigned to map to " +
						mappedClass + " since it is already providing mapping for " + this.mappedClass);
			}
		}
	}
 

 

然后是这句

 

initialize(mappedClass);

 

 找到这里.

 

 

/**
	 * Initialize the mapping metadata for the given class.
	 * @param mappedClass the mapped class.
	 */
	protected void initialize(Class mappedClass) {
		this.mappedClass = mappedClass;
		this.mappedFields = new HashMap();
		this.mappedProperties = new HashSet();
		PropertyDescriptor[] pds = BeanUtils.getPropertyDescriptors(mappedClass);
		for (int i = 0; i < pds.length; i++) {
			PropertyDescriptor pd = pds[i];
			if (pd.getWriteMethod() != null) {
				this.mappedFields.put(pd.getName().toLowerCase(), pd);
				String underscoredName = underscoreName(pd.getName());
				if (!pd.getName().toLowerCase().equals(underscoredName)) {
					this.mappedFields.put(underscoredName, pd);
				}
				this.mappedProperties.add(pd.getName());
			}
		}
	}

 

 

终于找到关键代码:

 

 

    /**
     * Convert a name in camelCase to an underscored name in lower case.
     * Any upper case letters are converted to lower case with a preceding underscore.
     * @param name the string containing original name
     * @return the converted name
     */
    private String underscoreName(String name) {
        StringBuffer result = new StringBuffer();
        if (name != null && name.length() > 0) {
            //把第一个字母小写了
            result.append(name.substring(0, 1).toLowerCase());
            for (int i = 1; i < name.length(); i++) {
                //获取第二个字母
                String s = name.substring(i, i + 1);
                //如果第二个字母是大写的
                if (s.equals(s.toUpperCase())) {
                    //给他添加下划线
                    result.append("_");
                    //然后加上第三个小写字母
                    result.append(s.toLowerCase());
                } else {
                    //或者直接返回
                    result.append(s);
                }
            }
        }
        return result.toString();
    }

 

 

执行完这段代码发现.

 

CPicPath被替换成了c_pic_path

T_CurTag被替换成了t_cur_tag和tcurtag

但是却没有一个和tCurTag替换出来的属性一样.所以实体的这个属性最终没有set到值

不知道我说的对不....个人理解.因为spring的有段源码实在看不懂..只能瞎猜了.

具体的原因是因为字段的下划线.所以在获取方法.根据set方法设置属性的时候发生了错位.造成set值失败

太晚了..有时间再详细研究...

总的来说就是下划线造成的.

 

我艹...讨厌的下划线

  • 大小: 11.2 KB
分享到:
评论
3 楼 jyjava 2012-09-28  
Castor,Jaxb,xbean,xStream
2 楼 wxq594808632 2012-09-06  
mengfei86 写道
顶,请问可以如果一个表,对应的一个实体,这个实体有个父类,如果查询到父类的值啊?

class.getGenericSuperclass()
1 楼 mengfei86 2012-09-05  
顶,请问可以如果一个表,对应的一个实体,这个实体有个父类,如果查询到父类的值啊?

相关推荐

    Spring笔记之整合JdbcTemplate.doc

    ### Spring与JdbcTemplate整合详解 #### 一、JdbcTemplate简介及使用 **1.1 JdbcTemplate概述** JdbcTemplate是Spring框架中的一个重要组成部分,它提供了一种简单而强大的方式来访问数据库,通过封装JDBC API,...

    springmvc整合JdbcTemplate框架

    4. **异常处理**:JdbcTemplate会将数据库抛出的异常转换为Spring的DataAccessException,这样可以提供统一的异常处理机制。 接下来,我们讨论整合Spring MVC与JdbcTemplate的具体步骤: 1. **创建Controller**:...

    jdbcTemplate集锦很好的推荐

    - **应用场景**:在需要将查询结果映射为Java对象时使用,例如将查询结果映射为`Item`对象。 #### 四、总结 通过以上介绍,我们可以看到`jdbcTemplate`提供了丰富的API来帮助我们高效地处理数据库操作。无论是简单...

    JdbcTemplate实例

    `JdbcTemplate`是Spring框架中用于简化数据库操作的模板类,它提供了丰富的API来执行SQL语句,包括插入、更新、删除以及查询等操作。在Java应用中,使用`JdbcTemplate`可以避免直接操作JDBC,减少代码量,提高代码的...

    some simple demo about hibernate3.2 and spring2.5

    这两个库在Java开发中扮演着重要角色,Hibernate是流行的对象关系映射(ORM)框架,而Spring则是一个全面的应用框架,提供了依赖注入、AOP(面向切面编程)以及数据访问等多种功能。 描述中提到的"NULL"意味着具体...

    spring-security-jdbc

    `RowMapper`用于将数据库查询结果转换为UserDetails对象,这是Spring Security的一个关键接口,包含了用户认证所需的所有信息。 接下来是授权部分。Spring Security允许我们在数据库中定义角色和权限。通常,我们会...

    spring JDBC

    - **异常转换**:如果执行过程中出现JDBC异常,`JdbcTemplate`会将其转换为Spring定义的异常类型,提高了异常处理的一致性和可读性。 ### 示例代码分析 #### 部分代码实现 下面是一个简单的示例,展示了如何使用...

    Spring学习笔记

    在XML配置中,可以使用元素来设置bean的属性,其中引用其他bean,设置常量值,&lt;null/&gt;则将属性设为null。 Spring的JDBC模板包括JdbcTemplate、NamedParameterJdbcTemplate和SimpleJdbcTemplate,它们简化了数据库...

    Spring.3.x企业应用开发实战(完整版).part2

    4.4.4 null值 4.4.5 级联属性 4.4.6 集合类型属性 4.4.7 简化配置方式 4.4.8 自动装配 4.5 方法注入 4.5.1 lookup方法注入 4.5.2 方法替换 4.6 之间的关系 4.6.1 继承 4.6.2 依赖 4.6.3 引用 4.7 整合多个配置文件 ...

    Spring Batch读取txt文件并写入数据库的方法教程

    Spring Batch 是一个强大的批处理框架,它为处理大量数据提供了灵活和可扩展的解决方案。在本教程中,我们将探讨如何使用 Spring Batch 读取文本(txt)文件,并将读取到的数据处理后写入数据库。 首先,我们需要...

    spring4.0.5源码

    通过深入研究Spring 4.0.5的源码,我们可以更好地理解Spring的工作原理,提高故障排查能力,同时也能为自己的项目提供更高效、更灵活的设计方案。源码学习不仅可以提升技术水平,也有助于我们保持对最新技术趋势的...

    spring2.5中文文档

    Spring 2.5版本是一个重要的里程碑,引入了许多改进和新特性,为开发者提供了更强大的功能和更好的开发体验。以下是对Spring 2.5中文文档的详细解读。 首先,Spring 2.5对依赖注入(Dependency Injection,DI)进行...

    SpringBoot整合持久层技术之搭建并整合Spring Data JPA项目

    例如,创建一个名为`User`的实体类: ```java import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity ...

    spring 3.0 jar包

    Spring 3.0 是Spring框架的一个重要版本,它在2009年发布,为Java开发者带来了许多新特性和改进。这个版本标志着Spring框架在企业级应用开发中的成熟,提供了更强大、更灵活的解决方案。以下是一些核心知识点: 1. ...

    Spring3.x企业应用开发实战(完整版) part1

    4.4.4 null值 4.4.5 级联属性 4.4.6 集合类型属性 4.4.7 简化配置方式 4.4.8 自动装配 4.5 方法注入 4.5.1 lookup方法注入 4.5.2 方法替换 4.6 之间的关系 4.6.1 继承 4.6.2 依赖 4.6.3 引用 4.7 整合多个配置文件 ...

    千锋最新版spring6.0框架GA版详解.pdf

    p名称空间允许在XML配置文件中以属性的形式指定bean的属性值;c名称空间则允许以构造函数参数的形式指定bean的属性值。 5. **复杂数据类型注入** 包括集合类型的注入、数组类型的注入等。 #### 四、注解方式的...

    Spring+ldap

    1. **LdapTemplate**:这是Spring-LDAP的核心组件,类似于Spring JDBC中的JdbcTemplate,它提供了一系列高级的LDAP操作方法,如查询、插入、更新和删除等。通过LdapTemplate,开发者可以轻松执行复杂的LDAP操作,而...

    spring3.0源码

    SPeL支持属性路径表达式、方法调用、条件和逻辑运算符、算术运算符,以及数组、集合和映射的操作。 4. **AOP增强**: Spring 3.0增强了AOP支持,引入了基于注解的切面定义,如`@Aspect`、`@Before`、`@After`等,...

    Spring Boot实战之数据库操作的示例代码

    Spring Boot实战中的数据库操作是后端开发的重要组成部分,本文将详细介绍如何使用Spring Boot进行数据库操作,包括使用JdbcTemplate、JPA和Mybatis三种不同的数据访问技术。 首先,要进行数据库操作,我们得先搭建...

Global site tag (gtag.js) - Google Analytics