Стиль кодирования: допустимо ли делать дополнительные запросы из классов моделей? - PullRequest
2 голосов
/ 05 февраля 2012

У меня есть класс модели Alert с отношением один ко многим с другим классом модели Occurrence, как показано ниже:

@Entity public class Alert extends Model
{
  public String name;

  @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="alert")
  public List<Occurrence> occurrences;
}

@Entity public class Occurrence extends Model
{
  @ManyToOne
  public Alert alert;

  @Column(nullable=false)
  public Date alertTime;
}

У меня есть представление, в котором перечислены оповещения в простой таблице, в которой должен быть столбец с надписью «Вхождения сегодня» со счетчиком количества появлений оповещения сегодня (по alertTime).

Кажется, я не могу найти способ сделать это, используя только аннотации JPA / Hibernate в классе модели Alert, и, поскольку я перечисляю Alerts, я не знаю чистого способа включить счет в каждый Alert объект.

Так что теперь я задаюсь вопросом, хорошо ли было бы просто запрашивать вхождения оповещения из внутри самого класса модели Alert, например:

@Entity public class Alert extends Model
{
  public String name;

  @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="alert")
  public List<Occurrence> occurrences;

  @Transient
  public long getOccurrencesToday()
  {
    return Occurrence.count(
      "alert = ? and alertTime >= ?",
      this, new DateMidnight().toDate());
  }
}

У меня такой вопрос: считается ли плохой формой делать запросы к БД из класса модели?

Вторичный вопрос: я подхожу к этому неправильно? Есть ли лучший способ достичь конечного результата, который я пропустил?

Ответы [ 2 ]

1 голос
/ 05 февраля 2012

выполнение запросов из класса модели домена должно быть правильным способом, поскольку эти запросы относятся к этой модели.С этой целью я не вижу никаких проблем с вашим кодом.

Согласно философии Play, предметный объект - это не просто объект данных.Он должен заключать в себе определенную бизнес-логику.На самом деле чистый объект данных не поощряется игрой.Проверьте больше на http://www.playframework.org/documentation/1.2.4/model

0 голосов
/ 06 февраля 2012

Хотя ваш подход заманчив, он опасен, потому что фактически вы помещаете логику в «метод получения» (getOccurferencesToday ()), к которому вы, вероятно, получите доступ по $ {alert.occurferencesToday}

Геттер всегда должен быть без побочных эффектов.

Я бы изменил это на

@Entity public class Alert extends Model
{
  public String name;

  @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="alert")
  public List<Occurrence> occurrences;

  @Transient public Long occurrencesToday = null;

  public void populateOccurrencesToday()
  {
    occurrencesToday = Occurrence.count(
      "alert = ? and alertTime >= ?",
      this, new DateMidnight().toDate());
  }
}

затем в вашем контроллере переберите все оповещения, которые вы собираетесь визуализировать и выполнить метод populateOccurferencesToday (). Если вы сейчас храните свой объект в кэше, его данные будут согласованы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...