JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Object Relational Mapping » Hibernate  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 Re:Hibernate 的 PO 直接付與 Business logic 合適嗎? [Re:koji]
ingramchen

Web monkey



發文: 479
積分: 12
於 2004-04-19 21:53 user profilesend a private message to usersend email to ingramchenreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
koji wrote:
這樣那如果資料庫有資料是必須update時不就不能透過setter
變成可能要先delete掉一筆資料在塞一筆資料才可以

koji


我的作法是將 PO 視為一個完整功能的 BO,下面的 code
增加 OrderItem 的一個新欄位 qty,並增加修改的功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// Example C:  OrderItem 增加 qty.
public class OrderItem {
  private Long id ;
  private String name;
  private Set orderLogs;
  private Integer qty;
 
  // qty, name, and credit are required.
  public OrderItem(String name, Long credit, Integer newQty) {
    //constructor pre-condition check.
    preconditionCheck(credit.intValue(), newQty.intValue()) ;
 
    //add setQty here
    setQty(newQty);
    setName(name);
    setOrderLogs(new HashSet());
 
    // call helper to add log.    
    createLog(credit); 
  }
 
  // provide a new method for modify item's qty.
  public void modifyQty(int modifiedQty, int credit) {
     // method's precondition check
     preconditionCheck(modifiedQty, credit) ;
 
     setQty(modifiedQty) ;
 
     // automatic generate a log for this modification. 
     createLog(credit) ;
  }
 
  // log create helper
  private void createLog(int credit) {
    OrderLog log = new OrderLog(credit);
    addOrderLog(log);
  }
 
  // note that addOrderLog become private.
  // we don't outside of class to deal with log at all.
  private void addOrderLog(OrderLog log) {
    log.setOrderItem(this);
    orderLogs.add(log);
  }
 
  // precondition helper
  private void preconditionCheck(int qty, int credit) {
      if(qty < 0 || credit < 0) {
          throw new IllegleArgumentException("qty and credit must > 0");
      }
  }
 
  // default constructor is private, this is for Hibernate
  private OrderItem() {
  }
 
  // add getter setter for qty
  private void setQty(Integer i )
  public Integer getQty() 
 
  // all setter private.
  private void setId(Long long1) 
  private void setName(String string) 
  private void setOrderLogs(Set set) 
  public Long getId() 
  public String getName() 
  public Set getOrderLogs()
}
 


上面改變了原本 constructor 的 parameter, 而且新增了一個 modifyQty()
的 method. 這個 method 內部除了會修改 Qty 這個 field 之外,還會
做 pre-condition check, 以及新增一筆修改的 log.

這個 PO/BO 的獲得方式有兩種,一是直接透過 constructor. 只要
construtor 設計的好,就不怕其他 developer (一個月後的自己.....)
隨便就 new 一個 OrderItem,胡亂 set 那、這的,然後隨便就給你來
個 session.save(orderItem)....

另一獲得的方式是藉由Hibernate 由資料庫 load 出來。load 出來要改,也要
通過 public 的 business method 去更動。 error-proof~~~

依這樣的設計,OrderItem 這個 PO 就變成有 "行為",也有資訊隱藏。
只要這個 class 的 unit test 完整, OrderItem 的使用者不論是新增,
修改,這個 class 都會處理的好好的,所以才說 PO 當 BO 用......

還是回來標題所問的..... 不知這樣的設計.... 未來會不會爆掉?


ingramchen edited on 2004-04-19 22:14
reply to postreply to post
話題樹型展開
人氣 標題 作者 字數 發文時間
5750 [精華] Hibernate 的 PO 直接付與 Business logic 合適嗎? ingramchen 3998 2004-04-18 13:23
4473 Re:Hibernate 的 PO 直接付與 Business logic 合適嗎? koji 73 2004-04-19 10:54
5577 Re:Hibernate 的 PO 直接付與 Business logic 合適嗎? ingramchen 2594 2004-04-19 21:53
4427 Re:Hibernate 的 PO 直接付與 Business logic 合適嗎? chrischang 305 2004-04-19 21:24
» JWorld@TW »  Object Relational Mapping » Hibernate

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8