我正在研究一个系统,我需要根据同一实体中的其他属性计算点数,即:
@Column(name = "distance")
private Integer distance;
@Column(name = "speed")
private Integer speed;
@Column(name = "calories")
private Integer calories ??
我需要根据速度和距离来计算卡路里,并保持这个值。
答案 0 :(得分:3)
创建一种新方法,例如updateCalories()
从距离和速度计算当前卡路里。每次 distance , speed 或其他相关字段更改(setter,constructor)或使用实体侦听器在创建/更新实体时自动调用该方法时调用此方法(@PreUpdate ,@ PrePersist ......)
答案 1 :(得分:2)
我会做两个选项
选项1:@Formular
@Formula("speed * distance")
private int calories;
卡路里在数据库中没有自己的列,但您可以通过getter访问它们。每次从数据库获取实体(值在内存中)时,都会计算卡路里。 @Formula的一个优点是你可以在那里写一个完整的命名查询,它可以引用不同的表值
选项2:@PreUpdate和/或@PrePersist
private int calories;
@PreUpdate
@PrePersist
public void calc() {
calories = speed * distance;
}
在此选项中,卡路里在数据库中确实有自己的列! 如果您使用EntityManager保留实体
,它已经计算并且保持不变答案 2 :(得分:0)
你不需要坚持下去 - 因为你可以随时获得总和的价值。你为什么要保存它? @Transient
public Integer getSum(){
return (distance + speed) * calories
}
使用@Transient无法将此值保存在DB中。