来自其他字段的JPA计算字段

时间:2016-07-02 16:07:20

标签: java jpa persistence

我正在研究一个系统,我需要根据同一实体中的其他属性计算点数,即:

@Column(name = "distance")
private Integer distance;
@Column(name = "speed")
private Integer speed;
@Column(name = "calories")
private Integer calories ??

我需要根据速度和距离来计算卡路里,并保持这个值。

3 个答案:

答案 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中。