关于hibernate字段映射@colunm出现的问题以及jpa驼峰大写转_小写的问题探究
2018年04月24日 15:47:26 守望dfdfdf 阅读数:735 标签: @colunmhibernate表映射实体类 更多
个人分类: 工作 问题
编辑
版权声明:本文为博主原创文章,转载请注明文章链接。 https://blog.csdn.net/xiaoanzi123/article/details/80064349
前提说明:文中所说的和这个dto是要和数据库的表映射的:这个dto类文件开头有如下注解:

@SelectBeforeUpdate(value = true)
@DynamicInsert(value = true)
@DynamicUpdate(value = true)
@javax.persistence.Entity
@javax.persistence.Table(name = "映射的数据库表名字")
@AccessType("field")

因为数据源临时变更为另一个地方,一查发现,要取出的数据库的表结构与原先的不一致,意味着查询sql以及封装的dto要重新编写代码,我把这些文件备份一份,然后再备份上修改。

首先看dao层:(因为表的字段上百了,所以用select *了,也就没有给每一个字段起别名)

public List<QlsxData_YW_Dto> getData(String strlast,String strtoday){
        String sql = String.format("select * from xxxxx where  UPDATE_DATE > '%s' and UPDATE_DATE < '%s' ",strlast,strtoday);
        List<QlsxData_YW_Dto> list = this.createSqlQuery(sql).setResultTransformer(Transformers.aliasToBean(QlsxData_YW_Dto.class)).list();
        return list;
    }

查询结果封装到dto里面了。因为新的数据源比原先的数据源的变化,只是多了几个字段,所以新的dto---
QlsxData_YW_Dto
只需要在原先dto的基础上添加上这几个字段的映射就行了。
库里面这几个字段如下:

Is_TouZiP;
NoUnify_Do;
UNUnifyDo_Other;
IsHasOwnFlow;
bszn_url;
NoSuit_ReasonDesc;
business_regulate;

添加的dto中的 代码如下:

@Column(name = "is_touzip")
private String istouzip;
@Column(name = "nounify_do")
private String nounifydo;
@Column(name = "ununifydo_other")
private String ununifydoother;
@Column(name = "ishasownflow")
private String ishasownflow;
@Column(name = "bszn_url")
private String bsznurl;
@Column(name = "nosuit_reasondesc")
private String nosuitreasondesc;
@Column(name = "business_regulate")
private String businessregulate;

很明显,我把注解中name属性的值都改为字段名字的全小写形式了。之所以这样,是因为,
前几天碰到了这个问题。当时数据库字段名字也是既有大小写驼峰还有下划线。我把注解中name属性的值写的和数据库字段名一样,然后下面的private String写的名字是 自己定义的标准形式驼峰命名。当把这个dto用hibernate的save方式存储到新的表里面时,就会有异常。说找不到 xxxx 字段。 举个例子,原来的字段是 zxcVb_d,就会报找不到字段 zxc_vb_d,我查了一下,说是jpa规范,把大写字母转化为 _ 加上 小写字母 的形式。于是当时注解中name属性的值都改为字段名字的全小写,这个问题就解决了。具体可以参考此文:Hibernate JAP 字段自动添加下划线问题,

可是,却报错了。异常说是找不到 Is_TouZiP的 setter方法。 Is_TouZiP是数据库的字段,而不是我写的is_touzip。
问题也很明显,就是查询结果因为字段没有映射上,封装失败。很郁闷,上次就是这样解决的,这次直接失败了。

因为这个dto里面有几个@Transient 的字段,看到一篇文章说。dto里不要有这些字段的get、set方法,试了一下还是老样子,最后没办法,不用自己起的名字了,直接这几个字段改为如下,(dto的名字和数据库字段名保持一致,不用注解@colunm了),如下:

@Column
private String Is_TouZiP;
@Column
private String NoUnify_Do;
@Column
private String UNUnifyDo_Other;
@Column
private String IsHasOwnFlow;
@Column
private String bszn_url;
@Column
private String NoSuit_ReasonDesc;
@Column
private String business_regulate;

问题解决。但是我一开始的写法(吸取上次经验),之前就行,这次咋就不行了呢?我试了几下实验:
一、
数据库的名字是:Is_SimplePunish
@Column(name = "is_simplepunish")
private String Is_SimplePunish; 无异常。

二、
数据库的名字是:Service_Sub_Kind
@Column(name = "Service_Sub_Kind")
private String Service_Sub_Kind; 无异常
------------------------------
数据库字段:QL_Sub_Kind ,
@Column(name = "ql_sub_kind")
private String QL_Sub_Kind ; 无异常。
当我把上述 改为
@Column(name = "ql_sub_kind")
private String tt;
运行,出现异常了。

通过上面这几个实验,发现 貌似 private string 的属性名,必须和数据库字段名保持一致,
【注意前面放出的那个草靠链接文章中,也是如此:

】,和 @Column(name = 貌似没有关系。
那么我刚才说的 jpa那个规范 就是大写字母变_+小写的 情况 什么时候出现呢?上述参考文章已经说了,但是刚才的实验二中Service_Sub_Kind 字段,也是驼峰啊,怎么没出现这个异常呢?不理解。继续实验:
数据库 FeeBasis字段:
@Column(name = "feebasis")
private String FeeBasis;
改为
@Column(name = "FeeBasis")
private String FeeBasis;
果然出现异常:数据插入失败:

关于jpa这个规范的问题,貌似不是标准驼峰的名字比如这种Service_Sub_Kind不受影响,而比如这种标准驼峰名字的FeeBasis,问题就来了。

关于这两个方面的问题,算是有了一个自己的探索总结把:
@Column(name = "feebasis")//建议直接全部写成全小写。
private String FeeBasis;//此处要和数据库的对应字段名字保持一致,不然会有 找不到 对应字段 的 setter方法的异常。

hibernate是要系统的学一学了。o(╯□╰)o

关于hibernate字段映射@colunm出现的问题以及jpa驼峰大写转_小写的问题探究的更多相关文章

  1. hibernate字段映射枚举类型

    上一篇介绍了mybatis字段映射枚举类型,这一篇给大家介绍一下hibernate字段怎么去映射枚举类型的(这只是一种参考方式,映射方法还有很多种). 还是以上篇sku表为例,sku表里一个statu ...

  2. hibernate的映射类型

    hibernate的映射类型 hibernate MySQL映射类型 1.Hibernate的映射类型 hibernate mysql映射类型 Hibernate 映射类型 Java 类型 标准 SQ ...

  3. Hibernate关联映射关系

    Hibernate关联映射关系 一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实 ...

  4. 攻城狮在路上(壹) Hibernate(九)--- Hibernate的映射类型

    Hibernate采用映射类型作为Java类型和SQL类型的桥梁,对应type属性.分为两种:内置映射类型和客户化映射类型.一.内置映射类型: 1.Java基本类型的Hibernate映射类型: Ja ...

  5. Oracle primary,unique,foreign 区别,Hibernate 关联映射

    Oracle primary,unique,foreign 区别 转:http://www.cnblogs.com/henw/archive/2012/08/15/2639510.html NOT N ...

  6. Hibernate基础映射

    在说Hibernate映射前,我们先来了解下对象关系映射 ORM.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现.这样开发人员就可以把对数据库的操作转化为对这些对象的操作.我们 ...

  7. hibernate集合映射inverse和cascade详解

    hibernate集合映射inverse和cascade详解   1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或 ...

  8. 第六章 Hibernate关联映射

    第六章 hibernate关联映射一.本章知识点分为2部分:1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系2.延迟加载:类级别加载策略,一对多加载策略,多对一 ...

  9. hibernate之映射文件VS映射注解

    前言 对于java开发者而言,注解应该不是一个陌生的概念,早在JavaSE阶段,例如@Override标记重写父类方法或实现接口方法,@Test标记单元测试方法,所以我们可以简单地把它理解为一种有特殊 ...

随机推荐

  1. 自定义等高 Cell

    1.介绍 1.1 代码自定义 cell(使用 frame) 创建一个继承自 UITableViewCell 的子类,比如 BookCell1. 在 initWithStyle:reuseIdentif ...

  2. Mole and Abandoned Mine

    Mole and Abandoned Mine n点m条边的无向图,删除第i条边花费c[i],问1到n只有一条路径时所需要的最小花费? \(2\le n\le 15\) . 我又A掉了一道zzs的题啦 ...

  3. JavaScript学习笔记——1.了解JavaScript

    百度百科: JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HT ...

  4. [SDOI2008]烧水问题 规律

    题目描述 把总质量为1kg的水分装在n个杯子里,每杯水的质量均为(1/n)kg,初始温度均为0℃.现需要把每一杯水都烧开.我们可以对任意一杯水进行加热.把一杯水的温度升高t℃所需的能量为(4200*t ...

  5. linux中脚本权限问题以及win下使用telnet测试linux端口

    一个脚本叫up,执行脚本报错如下: -bash: ./up: Permission denied 解决: chmod +rx up 在执行,OK了. /************************ ...

  6. Nginx 基本 安装..

    ubuntu 下 Nginx是高度自由化的Web服务器,它的功能是由许多模块来支持.如果使用了某个模块,这个模块使用了一些类似zlib或OpenSSL等的第三方库,那么就必须先安装这些软件.Ubunt ...

  7. 同源策略与 JSONP CORS

    同源策略与 JSONP CORS 同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以 ...

  8. CMOS和BIOS

      CMOS是一类特殊的RAM(断电时将丢失其存储内容) BIOS是软件,是程序! CMOS是芯片,是硬件! 实际上我们是通过BIOS这个程序,去设置COMS的参数的.. COMS是一块芯片,继承在主 ...

  9. 机器学习KNN实例之数字识别

  10. spring espect XX but YY

    注入和查找问题 HSF Consumer bean, 注入的是beanName='实际接口名', type='HSFSpringConsumerBean',  造成Autowire时查询出来的类型不匹 ...