首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate计算属性

Hibernate计算属性
EN

Stack Overflow用户
提问于 2021-05-17 23:59:48
回答 1查看 24关注 0票数 0

我有以下Hibernate实体:

代码语言:javascript
复制
@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,但我们都知道这不是可行的方法。

EN

回答 1

Stack Overflow用户

发布于 2021-05-20 17:13:15

如果想要反规范化模式,可以在表中添加一个实际的列,并使用SQL触发器处理更新。然后,您只需使用@Generated(GenerationTime.ALWAYS)注释该属性,Hibernate将在每次更新后刷新该属性。这可能也适用于@Formula,但我建议不要这么做。拥有这个平均值的意义是什么?我想你应该总是按需计算它,并且只在它成为一个性能问题时才考虑存储它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67573193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档