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

标签 java sql hibernate denormalization

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

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

最佳答案

我没有 Hibernate 将集合大小映射到字段的现成解决方案。通常有两种方式可以选择,一种是开箱即用的,另一种是更安全的

1)考虑使用预持久和预更新

类似这样的事情

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

关于java - Hibernate - 在字段中存储 oneToMany-Relation 中的元素数量? (例如评论数量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16846644/

相关文章:

mysql - 从数据库表中获取每月的记录

java - JPQL查询异常异常AST节点: {vector}

mysql - 如何对表格进行分组并根据前几行的数据获取一行的结果

java - setDefaultModelObject 上的 Wicket 标签未正确更改

java - 接受两个整数并返回两个整数中较大者的代码

java - 比较几乎所有字段都相同的对象

sql - 使用嵌套查询加速 SQL 查询

java - 在 cucumber-jvm 测试中回滚事务

java - Hibernate 为复杂的 JOIN 执行两个查询而不是一个

java - 如何在端口范围内找到开放端口?