Hibernate - 在一个字段中存储oneToMany-Relation中的元素数量? (例如评论数量)

时间:2013-05-30 22:09:18

标签: java sql hibernate denormalization

我有一个实体“帖子”,它有一组很多“评论”。现在我不希望每次想要显示注释的数量时都计算这个集合的大小,因此我想创建一个整数字段并在此处存储注释的数量。如果发布了评论,我想增加评论,如果评论被删除,我想减少评论。

hibernate为此提供了“开箱即用”的方法吗?或者我需要手动实现吗? (我认为这不是那么微不足道,因为我必须考虑并发性问题等。)

1 个答案:

答案 0 :(得分:1)

我没有为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();
  }
}