從BJUG的maillist里發掘一個我以前的舊帖出來,嘿嘿

以前我和limo同志做過一個Hibernate技巧情色版....嘿嘿,這次發動大家收集一下J2SE 5和JSR 220里的改進design的tips.我下午試驗JSR220的時候,找到幾個

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

例子, 比如Order和OrderItem,典型的一對多,一般我們這么做

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

8}


在J2SE5里面,

 1class 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}

就可以直接來處理,

1for (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
 2class ProductDescription {
 3  private String name;
 4  private String description;
 5  . and getters and setters
 6}

 7
 8@Entity(access = AccessType.FIELD)
 9class 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
 2class DomainModel {
 3//  modeling your model here
 4}

 5
 6@Entity
 7class 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
 2class DomainModel {
 3//  modeling your model here
 4}

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

同樣,通過繼承來隔離技術和Domain,然后在子類里作部署相關的動作。然后把DomainModel和PersistentDomainModel 分包,針對DomainModel編程,就Ok了。這個時候Domain會異常的干凈.....

5. Model Place as Factory

其實這個是一個通則,以前好像也討論過。

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

基本上下午2個小時的成果就這么多,我是在嘗試用JSR220 API代替以前我和limo寫的那個珍珠商城訂單部分得到的一些tips。總體而言,JSR220還是挺好的,我們可以很自然的運用一些模式和OO的手段還避免它的不足。同時上述做法在hibernate里也可以做,但是由于比較麻煩,大家一般還是做不到JSR220里,正是通過它的毛病強迫我們這么做.....(汗),也算體現出約定了。