Mapping calculated properties with JPA

亡梦爱人 提交于 2019-11-30 18:21:22

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.

I know that I am necro-ing this thread, but maybe it might help somebody out.

If you want to calculate the value on read, the @PostLoad annotation might be what you want:

@Transient
private BigDecimal totalAmount;

@PostLoad
public void onPostLoad() {
    BigDecimal amount = BigDecimal.ZERO;
    for (InvoiceLineItem lineItem : lineItems) {
        amount = amount.add(lineItem.getTotalAmount());
    }
    this.totalAmount = amount;
}

Perhaps the PrePersist annotation can be used for this.

@Column(name = "TOTAL_AMOUNT")
private BigDecimal totalAmount;

@PrePersist
public void updateTotalAmount() {
    BigDecimal amount = BigDecimal.ZERO;
    for (InvoiceLineItem lineItem : lineItems) {
        amount = amount.add(lineItem.getTotalAmount());
    }
    this.totalAmount = amount;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!