2016-07-02 7 views
-1

я работаю в системе, где мне нужно вычислить точки на основе других свойств в одной и той же сущности, а именно:JPA вычисляемое поле из других областей

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

Мне нужно рассчитать калории, основанные на скорости и расстояния и сохраняйте это значение.

ответ

2

Создать новый метод, например updateCalories(), который вычисляет текущие калорий от расстояния и скорости. Назовите этот метод каждый раз, когда расстояние, скорость или другие соответствующие поля меняются (сеттеры, конструктор) или использование сущностей слушателей автоматически вызывать метод, когда объект создается/обновляется (@PreUpdate, @PrePersist ...)

+0

спасибо, вот именно то, что мне было нужно! –

1

вам не нужно их упорствовать, потому что вы можете получить значение суммы в любом случае в любое время. Почему вы пытаетесь его сохранить? @Transient

public Integer getSum(){ 
return (distance + speed) * calories 
} 

Используйте @Transient, чтобы иметь возможность не сохранять это значение в БД.

1

есть два варианта я бы это

вариант 1: @Formular

@Formula("speed * distance") 
private int calories; 

Калории не имеет свою собственную колонку в базе данных, но вы можете получить доступ к ним через Ге tter. Калории будут вычисляться каждый раз, когда вы получаете сущность из базы данных (значение находится в памяти). Преимущество @Formula в том, что вы можете написать там полный именованный запрос, который может ссылаться на другое значение таблицы

Вариант 2: @PreUpdate и/или @PrePersist

private int calories; 

@PreUpdate 
@PrePersist 
public void calc() { 
    calories = speed * distance; 
} 

В этом варианте, у калорий есть свой столбец в базе данных! Его уже вычислили и Упорство, если вы будете упорствовать Субъект с EntityManager