【问题标题】:Using non-persistence related methods and fields in persistence entity在持久化实体中使用非持久化相关的方法和字段
【发布时间】:2010-10-27 20:38:57
【问题描述】:

我有一个与持久性相关的 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 :)";
    }
  } 
}

【问题讨论】:

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


    【解决方案1】:

    我想知道是否有任何充分的理由让我应该保持实体类的清洁并且不使用与持久性没有直接关系的字段和方法。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 2020-06-15
      相关资源
      最近更新 更多