Mapping calculated properties with JPA
java, jpa, persistence
Solution
What you've described is not a calculated property in JPA sense. You're calculating it yourself within your method - just mark that method as `@Transient` and JPA will ignore it.
If you truly need a calculated property (where "calculated" means "calculated via SQL expression"), you'll need to annotate it according to your JPA provider. For Hibernate you'd do that via `@Formula` annotation:
@Formula("col1 * col2")
public int getValue() {
...
}
Other providers may have their own ways to configure this; there's no JPA standard.
Problem
Is there a way to map a calculated property using JPA? Assuming I have an `Invoice` object with one or more `InvoiceLineItems` within it, I want to have a persistent calculated property on the `Invoice` class that gives me the total amount: ``` class Invoice { ... @Column(name = "TOTAL_AMOUNT") public BigDecimal getTotalAmount() { BigDecimal amount = BigDecimal.ZERO; for (InvoiceLineItem lineItem : lineItems) { amount = amount.add(lineItem.getTotalAmount()); } return amount; } } ``` Now, I could create a protected no-op `setTotalAmount` method to make JPA happy, but I was wondering if there is a way to let JPA know that the mapping is one way only and to avoid creating a superfluous setter method. Thanks, Aleks