编码风格:从模型类中进一步查询是否可以接受?

时间:2012-02-05 03:26:59

标签: jpa playframework

我有一个模型类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)。

我似乎无法在Alert模型类中仅使用JPA / Hibernate注释找到一种方法,因为我列出了警报,所以我不知道一种干净的方式来包含计算每个Alert对象。

所以现在我想知道是否可以简单地从 {/ 1}}模型类本身中的查询警报的发生情况,如下所示:

Alert

我的问题是:在模型类中对DB进行查询是否被认为是不好的形式?

第二个问题是:我是以错误的方式接近这个吗?有没有更好的方法来达到我错过的最终结果?

2 个答案:

答案 0 :(得分:1)

从域模型类中进行查询应该是正确的方法,使这些查询与该模型相关。为此,我认为您的代码没有任何问题。

从Play的理念来看,域对象不仅仅是一个数据对象。它应该包含一些内部的业务逻辑。实际上,游戏不鼓励纯数据对象。查看http://www.playframework.org/documentation/1.2.4/model

上的详情

答案 1 :(得分:0)

虽然你的方法很诱人,但它很危险,因为实际上你将逻辑放入“getter”(getOc​​currencesToday()),你可能会通过$ {alert.occurrencesToday}

来访问它

吸气剂应始终无副作用。

我会将此更改为

@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());
  }
}

然后在您的控制器中,迭代所有警报 你要渲染并执行populateOccurrencesToday()方法。 如果您现在将对象存储在缓存中,则其数据将保持一致。