我有一个模型类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进行查询是否被认为是不好的形式?
第二个问题是:我是以错误的方式接近这个吗?有没有更好的方法来达到我错过的最终结果?
答案 0 :(得分:1)
从域模型类中进行查询应该是正确的方法,使这些查询与该模型相关。为此,我认为您的代码没有任何问题。
从Play的理念来看,域对象不仅仅是一个数据对象。它应该包含一些内部的业务逻辑。实际上,游戏不鼓励纯数据对象。查看http://www.playframework.org/documentation/1.2.4/model
上的详情答案 1 :(得分:0)
虽然你的方法很诱人,但它很危险,因为实际上你将逻辑放入“getter”(getOccurrencesToday()),你可能会通过$ {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()方法。 如果您现在将对象存储在缓存中,则其数据将保持一致。