Esiste un modo per mappare una proprietà calcolata utilizzando JPA?Mappatura delle proprietà calcolate con JPA
Supponendo che ho un oggetto Invoice
con uno o più InvoiceLineItems
all'interno di esso, voglio avere una proprietà calcolata persistente sulla classe Invoice
che mi dà l'importo totale:
class Invoice {
...
@Column(name = "TOTAL_AMOUNT")
public BigDecimal getTotalAmount() {
BigDecimal amount = BigDecimal.ZERO;
for (InvoiceLineItem lineItem : lineItems) {
amount = amount.add(lineItem.getTotalAmount());
}
return amount;
}
}
Ora, ho potuto creare un protetto il metodo no-op setTotalAmount
per rendere felice JPA, ma mi chiedevo se c'è un modo per far sapere a JPA che la mappatura è solo un modo e per evitare di creare un metodo setter superfluo.
Grazie, Aleks
Marcatura proprietà come @Transient non mi aiuterà. Non voglio che JPA lo ignori: voglio che l'importo totale sia mantenuto in un database, così posso interrogarlo direttamente senza dover aggregare le informazioni dalla tabella figlia. Quindi quello che sto chiedendo è come mantenere una proprietà calcolata (in senso Java, completamente estraneo alla persistenza) senza dover implementare setter non necessari. –
Il tuo esempio è piuttosto strano allora. Se stai ** memorizzando ** questo valore e interrogandoci sopra, perché lo stai ricalcolando nel tuo getter? La linea di fondo, tuttavia, è che se si annota il metodo getter (al contrario della proprietà) è necessario avere un setter corrispondente (potrebbe essere privato) affinché JPA possa popolare quel valore sulla propria entità. – ChssPly76
L'esempio che ho dato è una grossolana semplificazione del modello di dominio con cui sto lavorando, che ha diversi livelli di relazioni da uno a molti, con proprietà calcolate ad ogni livello che dipende dai bambini. Calcolare il valore in Java come necessario è significativamente più semplice rispetto al tentativo di aggiornare il totale come oggetti secondari in una gerarchia (profonda) vengono aggiunti, rimossi o modificati, motivo per cui lo ricalcolo. –