我们已经学到如何使用 @Calculation 和 @DefaultValueCalculator 注解来同步持久和计算属性,以及如何为多用户环境定义逻辑。现在我们将用另一种定义业务逻辑的方法,这次从数据库。
数据库逻辑(@Formula)
@Calculation 或同步计算/持久属性的另一种替代方法是 @Formula 注解。 @Formula 是 JPA 标准的 Hibernate 扩展,它允许您将属性映射到 SQL 语句。例如,您可以在 CommercialDocument 中使用 @Formula 定义 estimatedProfit,如下:
@org.hibernate.annotations.Formula("TOTALAMOUNT * 0.10") // 使用 SQL 计算
@Setter(AccessLevel.NONE) // 只须 getter 所以不生成 setter
@Money
BigDecimal estimatedProfit; // 一个字段,像持久属性
这代表当从数据库中读取一个 CommercialDocument 时,estimatedProfit 字段将透过数据库由 @Formula 计算。用户可以在列表模式下通过 @Formula 的属性筛选或排序,不过它们始终是“只读”的,在详细信息模式下不会实时重新计算。由于它们是只读的,所以不需要 setter 方法,因此我们使用 @Setter(AccessLevel.NONE) 来防止 Lombok 生成 setter。此外,@Formula 的属性依赖数据库,因此您只能使用某些数据库支持的语法。