从BJUG的maillist里发掘一个我以前的旧帖出来,嘿嘿

以前我和limo同志做过一个Hibernate技巧情色版....嘿嘿,这次发动大家收集一下J2SE 5和JSR 220里的改进design的tips.我下午试验JSR220的时候,找到几个

1. Implement Moment-Interval and Moment-Interval-Details Using Iterable<T>

例子, 比如Order和OrderItem,典型的一对多,一般我们这么做

1 class  Order  {
2
3  private List<OrderItem> items;
4
5  public List<OrderItem> getItems() {
6     
7  }

8}


在J2SE5里面,

 1 class  Order  implements  Iterable < OrderItem >   {
 2
 3       private List<OrderItem> items;
 4
 5       public Iterator<OrderItem> iterator() {
 6               return items.iterator;
 7       }

 8
 9      public int getItemCount() {
10             
11      }

12      // and addItem removeItem and others
13}

就可以直接来处理,

1 for  (OrderItem item : order)  {
2}

从某种程度上利用enhanced for的语法,来简化语法。

trade-off: 不适合多个details 聚合,适合于简单的moment-interval和moment-interval-details。

2. Annotate Description with @Embeddable, and the Thing it describe with @Entity

例子,Product和ProductDescription

 1 @Embeddable
 2 class  ProductDescription  {
 3  private String name;
 4  private String description;
 5  . and getters and setters
 6}

 7
 8 @Entity(access  =  AccessType.FIELD)
 9 class  Product  {
10  private ProdcutDescription description;
11}

JSR220里,如果一个field是embeddable,而且对该field没有标注为@Transite,以及使用keyword transite,自动按Embedded处理,这一点是很方便的。

这个基本没发现trade-off


3. Avoid Database Primary Key in Domain Model Using @EmbeddableSuperclass

例子,在hibernate里,总是要给Domain加一个primary key,非常的不爽.
虽然也可以通过继承结构来避免,但是配置文件太多, JSR220里,通过自动处理的annotation ,可以节约很大的工作量。

 1 @EmbeddableSuperclass
 2 class  DomainModel  {
 3//  modeling your model here
 4}

 5
 6 @Entity
 7 class  PersistentDomainModel  extends  DomainModel  {
 8
 9   private long primaryKey;
10}

这个大家就一目了然了

4. Avoid Database Field in Domain Model Using @AttributeOverride


Annotation虽然简化了开发,但是仍然有一个问题,就是修改mapping的时候需要修改代码,这个很不好,而且影射的时候需要在domain里硬编码field
name,这个简直就是恶心,但是还是由办法避免的。

 1 @EmbeddableSuperclass
 2 class  DomainModel  {
 3//  modeling your model here
 4}

 5
 6
 7 @Entity
 8 @AttributeOverride(name = " property " , column = @Column(name = " fieldName " ))
 9 class  PersistentDomainModel  extends  DomainModel  {
10
11   private long primaryKey;
12}

同样,通过继承来隔离技术和Domain,然后在子类里作部署相关的动作。然后把DomainModel和PersistentDomainModel 分包,针对DomainModel编程,就Ok了。这个时候Domain会异常的干净.....

5. Model Place as Factory

其实这个是一个通则,以前好像也讨论过。

1 public   interface  Store  {
2  Order newOrder();
3  // and others;
4}

基本上下午2个小时的成果就这么多,我是在尝试用JSR220 API代替以前我和limo写的那个珍珠商城订单部分得到的一些tips。总体而言,JSR220还是挺好的,我们可以很自然的运用一些模式和OO的手段还避免它的不足。同时上述做法在hibernate里也可以做,但是由于比较麻烦,大家一般还是做不到。JSR220里,正是通过它的毛病强迫我们这么做.....(汗),也算体现出约定了。