最近半路上手一个历史项目,为了能够与历史的其它应用实现完美对接,决定在启动hibernate
的同时,采用validate
进行数据表的较验,以避免对其它程序产生影响。
问题描述
原主程序使用的是VB开发,而且由于第一版本的时间过长,所以也没有考虑多数据库类型的问题。在hibernate
做映射时,出现了类型不认识的异常。
比如,数据表中有Decimal
类型,该类型是一种固定小位位数的类型,比如:Decimal(10,2)
,表示小数点前面10
位,小数点后面2
位,该类型出现在了主键上:
(没有搞明白,为什么主键会是这么个类型,主键会有小数?)
解决问题的步骤
查阅官方文档
查询官方的映射规则,看是否有JAVA的类型,可以完美的映射到Decimal
上。
https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#basic-provided
结论:官方并没有映到Decimal
的默认类型。
自定义映射
由于太久没有自定义过映射(我们认为hibernate生成的就够好了),所以基本上已经淡忘了@Column
注解上,还有一项columnDefinition
属性是自定义映射的。
实现代码如下:
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(columnDefinition = "Decimal(18, 0)")
private BigDecimal f_qiju_id ;
有了columnDefinition
,一些其它奇葩的问题,比如:县市
不用boolean
而用char(1)
的问题,也就随之解决了。
除此以外,如果还有另外的一些不兼容的字段类型,比如:money
字段,无法在H2
中被识别,将严重的影响到了我们的测试。我们还可以使用终极的@Column(columnDefinition = "TEXT")
来解决。
columnDefinition = "TEXT"
= 任意字段类型
总结:
由于太久的使用“约定大于配置”的思想在团队内部进行开发,而忽略一些历史项目或是一些“有个性”的程序的存在。我们虽然屡次强调规范在团队开的重要性,但在处理一些历史项目时,却也要面对一些非规范问题。而此时,如何填坑,便成为了在历史项目上合作开发的重要一环。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。