三、Mapping persistent classes(映射持久类)
3.1 CaveatEmptor应用
从这一章开始,开始介绍一个复杂的应用CaveatEmptor,CaveatEmptor是一个在线拍卖系统,它充分的证明了ORM技术和Hibernate的强的功能。下载CaveatEmptor的代码,请到http://caveatemptor.hibernate.org。开始之前,为了让大家更加清楚的理解ORM的思路,我们首先假设CaveatEmptory应用的不存在的,那么第一步我们要做的就是先分析它的业务。
1.分析业务领域
首先,寻找主要的实体类,实体的概念通常应该是很容易被系统中的用户理解的东西,如Payment, Customer, Order, Item, Bid。当然也有一些是有点抽象的,比如PricingAlgorithm,但不管怎么样只要让人一看就明白的就可以了。那么在这个简单的拍卖业务中,共涉及三人实体Category, Item, and User,它们之间的关系如下图:
2.CaveatEmptor的领域模型
CaveatEmptor在线系统拍卖很多种的商品,从电子器件到飞机票。拍卖的过程遵循下面的流程:竞拍者在商品拍卖的有效期内对商品进行出价,直到有效期结束,出价最高者竞拍成功。
分析业务:
**在任何一个商店,商品都是有分类的,并且会把同类的商品放在一个货架上,那么同样,我们的拍卖系统也要分类,以提供用户方便的查询和检索功能。用户可以根据商品类别进行列表查询,或输入商品关键字进行查询。
**竞拍的结果包括一系列的竞拍价,其中最高者竞拍成功。用户的信息包括name, login, address, email address, and billing information.
**web of trust在线拍卖最重要的因素。用户可以在这里建立自已的信誉度,买方可以给卖方评论打分,评论结果是对所有人公开的。
分析图3.2这个模型:
??
**一件商品只能被拍卖一次。如果我们有一个项目实体名为Item,因此我们可以直接把Item和Bid直接关联起来。在一次拍卖中用户可以给其它用户(卖方)写一些Comments,因此Item和Comments还是有关联的。
**用户的Address是单独隔离的,即使一个User只有一个Address。我们允许一个用户拥有多个BillingDetails。不同的订单被作为一个抽象类的子类。
**一个Category里面可能嵌套着很多子类。在图中表现为一个递归的关联,就是自已关联自已。注意,每一个Category虽然有多个子类,但只有一个父类。一个Item至少属于一个Category。