我有一个实体“帖子”,它有一组许多“评论”。现在我不想每次想显示评论数量时都计算这个集合的大小,因此我想创建一个整数字段并在此处存储评论数量。如果发表评论,我想增加它,如果评论被删除,我想减少它。
hibernate为此提供了任何“开箱即用”的方法吗?还是我需要手动实现?(我认为这不是那么微不足道,因为我必须考虑并发问题等)
我有一个实体“帖子”,它有一组许多“评论”。现在我不想每次想显示评论数量时都计算这个集合的大小,因此我想创建一个整数字段并在此处存储评论数量。如果发表评论,我想增加它,如果评论被删除,我想减少它。
hibernate为此提供了任何“开箱即用”的方法吗?还是我需要手动实现?(我认为这不是那么微不足道,因为我必须考虑并发问题等)
我没有开箱即用的解决方案让休眠将集合大小映射到字段。通常有两种方式可供选择,一种更开箱即用,另一种更安全
1)考虑使用pre-persist和pre-update
像这样的东西
public Foo {
@OneToMany
private List<Bar> bars;
@Column
private int barSize;
@PrePersist
@PreUpdate
public void updateBarSize() {
this.barSize = (bars==null ? 0 : bar.size());
}
}
2) 不要直接操作实体中的集合,而是提供 addChild()、removeChild() 来操作集合,并在 getChild() 时返回不可变的集合克隆。通过这样做,您可以安全地跟踪大小并在调用 addChild()/removeChild() 时更新整数值。
例如
public Foo {
@OneToMany
private List<Bar> bars;
@Column
private int barSize;
public List<Bar> getBars() {
return Collections.unmodifiableList(bars);
}
public synchronized void addBar(Bar bar) {
this.bars.add(bar);
this.barSize = bars.size();
}
}