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

前提说明:文中所说的和这个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



猜你喜欢

转载自blog.csdn.net/xiaoanzi123/article/details/80064349