¿Hay alguna forma de asignar una propiedad calculada mediante JPA?Asignación de propiedades calculadas con JPA
Suponiendo que tengo un objeto Invoice
con uno o más InvoiceLineItems
dentro de ella, quiero tener una propiedad persistente calculado sobre la clase Invoice
que me da la cantidad total:
class Invoice {
...
@Column(name = "TOTAL_AMOUNT")
public BigDecimal getTotalAmount() {
BigDecimal amount = BigDecimal.ZERO;
for (InvoiceLineItem lineItem : lineItems) {
amount = amount.add(lineItem.getTotalAmount());
}
return amount;
}
}
Ahora, podría crear una método setTotalAmount
protegido no-operativo setTotalAmount
para hacer feliz a JPA, pero me preguntaba si hay una forma de hacerle saber a JPA que el mapeo es de una sola manera y para evitar crear un método setter superfluo.
Gracias, Aleks
Marcado propiedad como @Transient no me ayudará. No quiero que JPA lo ignore: quiero que persista la cantidad total en una base de datos para poder consultarla directamente sin tener que agregar información de la tabla secundaria. Entonces, lo que estoy preguntando es cómo persistir una propiedad calculada (en el sentido de Java, sin relación con la persistencia) sin tener que implementar un setter innecesario para ella. –
Tu ejemplo es bastante extraño entonces. Si ** está almacenando ** este valor y lo está consultando, ¿por qué está recalculando en su getter? La conclusión, sin embargo, es que si anota el método getter (en lugar de la propiedad) debe tener un setter correspondiente (puede ser privado) para que JPA puecle ese valor en su entidad. – ChssPly76
El ejemplo que brindé es una simplificación excesiva del modelo de dominio con el que estoy trabajando, que tiene varios niveles de relaciones de uno a muchos, con una propiedad calculada en cada nivel que depende de los niños. Calcular el valor en Java según sea necesario es mucho más fácil que intentar actualizar el total a medida que se agregan, eliminan o modifican objetos secundarios en una jerarquía (profunda), por lo que lo estoy recalculando. –