2016-07-02 8 views
-1

ich auf einem System arbeite, wo ich Punkte zu berechnen, basierend auf anderen Objekten in derselben Einheit, das heißt:JPA berechnetes Feld von anderen Feldern

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

Ich brauche die Kalorien auf Geschwindigkeit und Distanz zu berechnen und behalte diesen Wert ..

Antwort

2

Erstellen Sie ein neues Verfahren, z updateCalories() die aktuellen Kalorien aus Entfernung und Geschwindigkeit berechnet. Rufen Sie diese Methode jedes Mal, wenn Abstand, Geschwindigkeit oder anderen relevanten Bereichen ändern (Einrichter, Konstruktor) oder Hörer Verwendung Einheit automatisch die Methode aufrufen, wenn Entität erstellt/aktualisiert (@PreUpdate, @PrePersist ...)

+0

persistent bleiben, das ist genau das, was ich brauchte! –

1

du musst sie nicht persistieren - weil du den Wert der Summe sowieso jederzeit bekommen kannst. Warum versuchst du es zu speichern? @Transient

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

Verwenden @Transient der Lage sein, diesen Wert nicht in DB zu speichern.

1

Es gibt zwei Optionen, die ich dieses

Option 1 tun würde: @Formular

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

Kalorien keine eigene Spalte in der Datenbank haben, aber Sie können sie über ge zugreifen tter .. Kalorien werden jedes Mal berechnet, wenn Sie die Entität von der Datenbank erhalten (Wert ist im Speicher). Ein Vorteil @Formula ist, dass Sie eine vollständige Benannte Abfrage schreiben können, die auf einem anderen Tabellenwert

Option 2 beziehen: @PreUpdate und/oder @PrePersist

private int calories; 

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

In dieser Option, Kalorien haben ihre eigene Spalte in der Datenbank! Es ist bereits berechnet und Persist, wenn Sie eine Entity mit EntityManager