Использование не связанных с постоянством методов и полей в персистентном объекте - PullRequest
1 голос
/ 28 октября 2010

У меня есть код 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 Ответ

1 голос
/ 28 октября 2010

Я хотел бы знать, есть ли какие-либо веские причины, по которым я должен поддерживать чистоту классов сущностей и не использовать поля и методы, не связанные напрямую с постоянством.

Нет ничего плохого в том, чтобы добавлять методы, не связанные напрямую с постоянством, а выполнять деловые операции с данными, полученными из хранилища данных, - и фактически реализовывать модель расширенного домена (против Модель анемичной области ).

Таким образом, вместо использования процедурных стилей, переместите бизнес-логику в объект расширенного домена.Например (взято из доменного проектирования с 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;
    }
//...
}
...