Jpa 编码风格:可以从模型类中进行进一步查询吗?

Jpa 编码风格:可以从模型类中进行进一步查询吗?,jpa,playframework,Jpa,Playframework,我有一个与另一个模型类事件具有一对多关系的模型类警报,如下所示: @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 Occu

我有一个与另一个模型类事件具有一对多关系的模型类警报,如下所示:

@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;
}
我的问题是:在一个模型类中对数据库进行查询是否被认为是不好的形式


第二个问题是:我是不是走错了路?有没有更好的方法来实现我错过的最终结果?

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


从Play的理念来看,域对象不仅仅是一个数据对象。它应该包含某些业务逻辑。事实上,纯粹的数据对象不受游戏的鼓励。查看更多关于

虽然您的方法很诱人,但它很危险,因为实际上您正在将逻辑放入getter getOccurrencesToday,您可能会通过${alert.occurrencesToday}访问该getter getOccurrencesToday

吸气剂应该总是没有副作用的

我会把这个换成

@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方法。
如果现在将对象存储在缓存中,则其数据将保持一致

同意贫血的对象模型的事情-这是一个很长时间以来我的愤怒。我从示例代码中省略了域逻辑,以保持其小:没有任何东西阻止您将结果缓存到模型对象中。只需使用与controllerA澄清中使用的相同的缓存方法:我对从模型类中执行查询的担心是,当控制器类缓存模型实例时,它可能无法获得预期的行为。也就是说,控制器认为它正在从缓存中获取稍旧的数据,而实际上每次都从数据库中获取某些属性。此外,重复访问该属性的视图可能会导致非明显的性能损失。非常感谢您的回答。我明白你的意思,但我想知道选择计数查询是否真的有副作用。。。六羟甲基三聚氰胺六甲醚。。。此外,虽然您的解决方案很简洁,但它确实需要将结果迭代两次。不过,我认为这是真正的答案。再次感谢!问题不在于选择计数本身,而在于将其放入getter。您无法轻松预测调用此getter的频率以及执行代码的频率。e、 如果你有这样的视图代码{if object.occurrencesToday}{if object.occurrencesToday==0}我们今天没有出现{/if}{else}{if object.occurrencesToday==1}这每天发生一次{/if}{else}这发生{object.occurrencesToday}次{/else}{/else}很难甚至不可能知道play调用method/db的频率。
@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());
  }
}