Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mapping calculated properties with JPA

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

like image 255
Aleksandar Seovic Avatar asked Aug 31 '09 22:08

Aleksandar Seovic


1 Answers

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.

like image 142
ChssPly76 Avatar answered Sep 27 '22 15:09

ChssPly76