在持久性实体中使用非持久性相关的方法和字段

时间:2010-10-27 20:38:58

标签: google-app-engine coding-style java-ee persistence objectify

我有一个与持久性相关的java-ee代码,我需要重写它以使应用程序在Google App Engine及其数据存储上运行。当我使用java-ee持久性提供程序时,我使用IDE生成持久性实体,并且我保持它们的方式,以防我需要重新生成它们。但是,无法为app-engine存储自动生成实体类,我想知道是否有任何充分的理由为什么我应该保持实体类清洁而不使用与持久性没有直接关系的字段和方法。如果重要的话,我使用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 个答案:

答案 0 :(得分:1)

  

我想知道为什么我应该保持实体类干净并且不使用与持久性没有直接关系的字段和方法。

添加不直接与持久性相关的方法,但使用从数据存储中检索的数据进行业务处理并实际实现 Rich Domain Model (与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;
    }
//...
}