我有以下Hibernate实体:
@Entity
@Table(name = "jobs")
public class Job {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "jobs_j_id_seq")
@SequenceGenerator(sequenceName = "jobs_j_id_seq", name = "jobs_j_id_seq", allocationSize = 1)
@Column(name = "j_id")
private Long id;
@Column(name = "j_description", length = 300, nullable = false)
private String description;
@Column(name = "j_category", length = 50, nullable = false)
@Enumerated(EnumType.STRING)
private JobCategory category;
@Column(name = "j_job_provided", length = 50, nullable = false)
private String jobProvided;
@ManyToOne(fetch = FetchType.EAGER, optional = false, cascade = CascadeType.ALL)
@JoinColumn(name = "j_provider_id")
private User provider;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "job")
private Set<Review> reviews;
@Transient
private Long averageRating;
.
.
.
}计算averageRating变量的值的正确方法是什么?我读过关于@Formula的文章,但我知道这只在实体第一次被获取时有效。这意味着如果向作业实例添加了新的审查,JPA将更新作业,但@Formula将不会再次运行,从而导致不会重新计算我的值。
有没有一种方法可以让动态@Formula对变化做出反应?
我总是可以遍历评论并计算averageRating,但我们都知道这不是可行的方法。
发布于 2021-05-20 17:13:15
如果想要反规范化模式,可以在表中添加一个实际的列,并使用SQL触发器处理更新。然后,您只需使用@Generated(GenerationTime.ALWAYS)注释该属性,Hibernate将在每次更新后刷新该属性。这可能也适用于@Formula,但我建议不要这么做。拥有这个平均值的意义是什么?我想你应该总是按需计算它,并且只在它成为一个性能问题时才考虑存储它。
https://stackoverflow.com/questions/67573193
复制相似问题