1

我有一個持久性相關的java-ee代碼,我需要重寫該代碼才能使應用程序在Google App Engine及其數據存儲上運行。當我使用java-ee持久性提供程序時,我使用IDE生成持久性實體,並保持它們的方式以防萬一需要重新生成它們。但是,爲應用引擎存儲自動生成實體類是不可能的,我想知道是否有任何理由讓我保持實體類的清潔,並且不使用與持久性沒有直接關係的字段和方法。如果它很重要,我使用objectify作爲持久性提供者。在持久性實體中使用非持久性相關的方法和字段

下面是一個例子:

public class Dog { 
    @Id Long id; 
    @Transient Integer barkCount; 

    public String bark() { 
    barkCount++; 
    return "woof-woof"; 
    } 

    public String getAgeEstimation() { 
    switch(barkCount) { 
     case 0:  return "unborn (or very lazy)"; 
     case 10000: return "this is very old dawg"; 
     default: return "you get the idea :)"; 
    } 
    } 
} 

回答

1

我想知道是否有任何好的理由,爲什麼我應該保持實體類清潔,不要使用沒有直接關係的持久性字段和方法。

沒有什麼不妥加入方法沒有直接關係的持久性,但這樣做與數據存儲檢索的數據業務的事情 - 實際上實施豐富的域模型(VS的Anemic Domain Model)。

因此,不要使用過程式服務,而是將業務邏輯移入豐富的域對象中。例如(取自Domain-driven design with Java EE 6):

@Entity 
public class Load { 

    @OneToMany(cascade = CascadeType.ALL) 
    private List<OrderItem> orderItems; 
    @Id 
    private Long id; 

    protected Load() { 
     this.orderItems = new ArrayList<OrderItem>(); 
    } 

    public int getShippingCosts() { 
     int shippingCosts = 0; 
     for (OrderItem orderItem : orderItems) { 
      shippingCosts += orderItem.getShippingCost(); 
     } 
     return shippingCosts; 
    } 
//... 
}