如何解决休眠计算属性
我有以下 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",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
,但我知道这仅在第一次获取实体时有效。这意味着如果将新评论添加到 Job 实例,JPA 将更新该作业,但 @Formula
不会再次运行,从而导致不会重新计算我的值。
有没有办法让动态 @Formula
对变化做出反应?
我总是可以遍历评论并计算平均评分,但众所周知,这不是可行的方法。
解决方法
如果您想对架构进行非规范化,您可以在表上添加一个实际列并使用 SQL 触发器处理更新。然后您只需使用 @Generated(GenerationTime.ALWAYS)
注释该属性,Hibernate 将在每次更新后刷新该属性。这也可能适用于 @Formula
,但我建议不要这样做。有这个平均值有什么意义? IMO,您应该始终按需计算它,并仅在出现性能问题时才考虑存储它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。