JAVA认证:数据库相关之精彩的ORM映射框架
说到持久层框架或方案,首先想到的就是实体Bean。被实体豆折磨过的朋友都知道,不简单,也不简单。无论是CMP还是BMP的实体豆,曾经以J2EE为浮华之都的实体豆,今天回头看都像个怪胎,甚至让人哭笑不得。EBJ3.0中引入的JPA,终结了“轻量与重量的持久之争”,同时也给实体Bean判了死刑。基于实体Bean的昂贵系统也成为遗留系统。
轻量级持久解决方案从萌芽、形成、广泛应用到最终打败实体豆的过程,揭示了现代科技发展的许多客观规律。这些规律我觉得有一条可以概括为“简约而不简单”。通过最简单的表达手段达到的表达效果一直是各个领域创作者追求的目标,软件也不例外。所以“极简主义”应该是我们软件设计的基本思路之一
相比实体Bean,轻量级持久化方案要“简单”得多。纯POJO不依赖于任何框架,便于领域建模、单元测试、移植、维护和扩展。但是在JDK1.5之前,面对轻量级ORM中繁杂的配置文件,如何有效管理是一件很头疼的事情。虽然一些ORM系统通过引入Jakarta Commons属性或类似的思路实现了源级标签声明持久层对象映射,但是杂乱的标签定义仍然无法从根本上提高映射属性配置信息管理和维护的复杂度。
JDK 1.5之后,Annotation的引入为我们提供了一个非常好的源码级配置处理方法。因此在各种项目中得到了很好的引用,使得持久层的方案更加简单。尤其是JPA,可以被视为“简单”持久层的一个里程碑。因此,现在谈论如何摧毁EJB会有点滑稽,就像两年前春天的罗德·约翰逊叔叔所做的那样。
Hibernate3.2已经实现了JPA,很多持久性ORM框架也会实现JPA,所以如果你使用这些框架,在升级版中还是可以享受到一些简单性的。但是,“简单”是无止境的,永远不可能轻易达到完美的状态,JPA也是如此。
这里用EasyDBO框架举一个简单的例子来演示追求“简单”的过程。
可以不使用配置文件,直接使用Java注释标签。持久层对象是这样定义的:
@ table(tablename = " orderinfo ")
公共类order实现serializable {
@ tablefield(name = " id ")
私有号id;//主键id
@ table field(name = " sn ")
私有字符串sn;//订单号
@ table field(name = " vdate ")
私人日期vdate;//订单日期
@ tablefield (name = "必选")
私人日期必选;//发货日期
@ table field(name = " paytype ")
私有字符串paytype;//付款方式
@ table field(name = " Linkman ")
私串Linkman;//contact
@ table field(name = " tel ")
private string tel;//电话
@ table field(name = " address ")
私有字符串地址;//address
@ table field(name = " requirement ")
私有字符串要求;//需求描述
@ table field(name = " remark ")
私有字符串remark;//备注
@ table field(name = " amount ")
Private Bigdecimal amount;//订单总金额
@ table field(name = " hand person ")
私有字符串hand person;//由
@ table field(name = " input user ")
私有字符串输入用户处理;//由
@ table field(name = " input time ")
private date输入时间输入;//输入时间
@ table field(name = " op user ")
私有字符串op user;//operator
@ table field(name = " opitro ")
私有字符串opitro;//操作介绍
@ table field(name = " optime ")
私人日期optime;//操作时间
@ table field(name = " status ")
私有整数状态;//订单状态
@ table field(name = " payment ")
私有整数支付;//支付状态
@ one toone(column = " customer _ id ",type = customer.class)
私人客户客户;//一对一关联,订单对应的客户
@ many toone(column = " order _ id ",type = order detail . class)
privateset < order detail > children = new hashset < order detail >();//一对多关联,详情下方订单
公众号getid () {
返回id;
}
public void setId(Number id){
this。id = id
}
public String get address(){
返回地址;
}
…省略后面常见的getter和setter
}
因为不再需要使用配置文件,所以通过Java注释标签在源代码级别识别映射关系就简单多了,也非常方便开发工具识别。但是写多了就会发现,重复的标签那么多,而且大部分内容都是相同或相似的,依靠代码生成工具总是不是办法。比如@ tablefield (name = "XXX "),其中80%以上的XXX都是属性的字段名称,所以ORM系统应该提供这些默认配置。以下是删除所有重复和常规标签后的持久层对象顺序的改进写法:
@ table(tablename = " Order info ")
public class Order实现serializable {
@ one toone(column = " Customer _ id ",type = Customer。class )
私人客户客户;//一对一关联,订单对应的客户
@ many toone(column = " order _ id ",type = order detail . class)
privateset < order detail > children = new hashset < order detail >();//一对多关联,明细在订单
私号id下面;//主键id
私有字符串sn;//订单号
私人日期vdate//订单日期
私人日期必填;//交付日期
私有字符串payType//支付方式
私有字符串联系人;//联系人
私串tel//电话
私有字符串地址;//地址
私有字符串要求;//需求描述
私有字符串备注;//备注
private BigDecimal amount;//订单总金额
私有字符串handPerson//由
private String inputUser处理;//由inputTime的
private Date输入;//输入时间
私有字符串opUser//运算符
私有字符串opIntro//操作介绍
私密日期opTime//操作时间
私有整数状态;//订单状态
私有整数支付;//支付状态
public number getid(){
返回ID;
}
public void setId(Number id){
this。id = id
}
…省略通常的getter和setter
}
。当然,在上面的POJO中,除了一对一和一对多的关联之外,其他的都是用相同的数据表字段名和对象的属性名进行映射。为了追求完美,你也会建议@OneToOne标签也要保存。此外,表名、多表映射、关联字段等。可以进一步“收缩”,更复杂(“不简单”)的处理可以通过ORM框架来处理。
0条评论