openxava / documentación / Lección 17: Lógica desde la base de datos

Curso: 1. Primeros pasos | 2. Modelo básico del dominio (1)  | 3. Modelo básico del dominio (2) | 4. Refinar la interfaz de usuario | 5. Desarrollo ágil | 6. Herencia de superclases mapedas | 7. Herencia de entidades | 8. Herencia de vistas | 9. Propiedades Java | 10. Propiedades calculadas | 11. @DefaultValueCalculator en colecciones | 12. @Calculation y totales de colección | 13. @DefaultValueCalculator desde archivo | 14. Evolución del esquema manual | 15. Cálculo de valor por defecto multiusuario | 16. Sincronizar propiedades persistentes y calculadas | 17. Lógica desde la base de datos | 18. Validando con @EntityValidator | 19. Alternativas de validación  | 20. Validación al borrar  21. Anotación Bean Validation propia | 22. Llamada REST desde una validación  | 23. Atributos en anotaciones  | 24. Refinar el comportamiento predefinido | 25. Comportamiento y lógica de negocio | 26. Referencias y colecciones | A. Arquitectura y filosofía | B. Java Persistence API | C. Anotaciones | D. Pruebas automáticas

Tabla de contenidos

Lección 17: Lógica desde la base de datos
Uso de @Formula
Resumen
Hemos aprendido cómo podemos sincronizar propiedades persistentes y calculadas, utilizando la anotación @Calculation y @DefaultValueCalculator, así como podemos definir lógica para ambientes multiusuario. Veremos ahora otro método para definir lógica de negocio, esta vez desde la base de datos.
Si no te gustan los videos sigue las instrucciones a continuación.

Uso de @Formula

Otra alternativa a @Calculation, o a tener propiedades calculadas y persistentes sincronizadas, es la anotación @Formula. @Formula es una extensión de Hibernate al estándar JPA, que permite mapear una propiedad a un fragmento de SQL. Por ejemplo, puedes definir beneficioEstimado con @Formula en DocumentoComercial como se muestra en el siguiente código:
@org.hibernate.annotations.Formula("IMPORTETOTAL * 0.10") // El cálculo usando SQL
@Setter(AccessLevel.NONE) // El setter no se genera, sólo necesitamos el getter
@Money
BigDecimal beneficioEstimado; // Un campo, como con una propiedad persistente
Esto significa que cuando un DocumentoComercial se lea de la base de datos, el campo beneficioEstimado se rellenerá con el cálculo de @Formula que es ejecutado por la base de datos. El usuario puede filtrar y ordenar por las propiedades @Formula en modo lista, pero siempre son de solo lectura y no se recalculan en tiempo real en modo detalle. Dado que son de sólo lectura no necesitan el método setter, por lo que la hemos anotamos con @Setter(AccessLevel.NONE) para que Lombok no genere el setter. Además, las propiedades @Formula dependen de la base de datos, porque podrías usar sintaxis sólo soportada por cierto fabricante de base de datos.

Resumen

En esta lección has aprendido algunas formas comunes de añadir lógica de negocio a tus entidades. No hay duda sobre la utilidad de las propiedades calculadas, @Calculation, los métodos de retrollamada o @Formula. Sin embargo, todavía tenemos muchas otras formas de añadir lógica a tu aplicación OpenXava, que vamos a aprender a usar.
En futuros lecciones verás como añadir validación, modificar el funcionamiento estándar del módulo y añadir tu propia lógica de negocio, entre otras formas de añadir lógica personalizada a tu aplicación.

Descargar código fuente de esta lección

¿Problemas con la lección? Pregunta en el foro ¿Ha ido bien? Ve a la lección 18