openxava / documentación / Lección 14: Evolución del esquema manual

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 14: Evolución del esquema manual
Evolución del esquema manual
Resumen
Vimos cómo podemos definir totales desde un archivo externo, lográndo de esa manera mantener independiente los parámetros de configuración de nuestra lógica de negocio, sin necesidad de modificar código para configurarlos. En esta lección, veremos cómo modificar las tablas de nuestra base de datos utilizando sentencias SQL, con el fin de aprender cómo modificar el esquema sin perder información o datos contenidos en el mismo.
Si no te gustan los videos sigue las instrucciones a continuación.

Evolución de esquema manual

Cuando usamos cosas como @Calculation o @DefaultValueCalculator la evolución de esquema automática que provee OpenXava se nos queda corta, porque añade una nueva columna cuando tu añades una nueva propiedad, pero no rellena la columna con los valores correctos. En este caso hemos añadido varias propiedades persistentes con @Calculation cuyos valores no se recalculan hasta que el usuario interactua con el registro. Además, tenemos un valor por defecto para porcentajeIVA que sólo tiene efecto cuando el usuario crea un nuevo registro pero no en los registros ya existentes. Hemos de rellenar las nuevas columnas con valores razonables.
Dado que estamos en una etapa temprana del desarrollo una buena opción sería borrar todos los registros, pero es seguro que esto no es una buena idea para producción, por tanto vamos a ajustar nuestra base de datos al nuevo código sin perder información para ilustrar la evolución manual de esquema.
Lo más fácil es usar la propia aplicación para hacer las actualizaciones. Vamos a hacerlo para actualizar los precios de los productos. Para que las nuevas propiedades calculadas funcionen bien todos los productos deberían tener un precio, por tanto ve al módulo Producto con tu navegador y asegurate de que todos los productos tienen precio:
business-logic_es040.png
Si algún producto no tiene precio edítalo e introduce un precio.
Los siguientes cambios no son tan sencillos, por lo que vamos a ejecutar sentencias SQL contra nuestra base de datos. Para ejecutar estas sentencias SQL, primero asegurate de que tu aplicación se está ejecutando, después usa la opción de menú OpenXava > Database Manager de OpenXava Studio::
inheritance040.png
Ahora estás listo para escribir y ejecutar SQLs. Primero, establecemos el valor para la columna precioPorUnidad en todos los detalles:
UPDATE DOCUMENTOCOMERCIAL_DETALLES 
SET PRECIOPORUNIDAD = (
    SELECT PRECIO FROM PRODUCTO 
    WHERE NUMERO = PRODUCTO_NUMERO
)
Ahora actualizamos porcentajeIVA para todas las facturas:
UPDATE DOCUMENTOCOMERCIAL
SET PORCENTAJEIVA = 21
Lo siguiente es actualizar iva:
UPDATE DOCUMENTOCOMERCIAL
SET IVA = (
    SELECT SUM(PRECIOPORUNIDAD * CANTIDAD) * 0.21 
    FROM DOCUMENTOCOMERCIAL_DETALLES D 
    WHERE D.DOCUMENTOCOMERCIAL_OID = DOCUMENTOCOMERCIAL.OID
)
Finalmente, actualizamos importeTotal en todas las facturas:
UPDATE DOCUMENTOCOMERCIAL
SET IMPORTETOTAL = (
    SELECT SUM(PRECIOPORUNIDAD * CANTIDAD) * 1.21 
    FROM DOCUMENTOCOMERCIAL_DETALLES D 
    WHERE D.DOCUMENTOCOMERCIAL_OID = DOCUMENTOCOMERCIAL.OID
)
Ten cuidado, las sentencias de arriba funciona bien con HSQLDB, la base de datos incluida con OpenXava. Si usas otra base de datos probablemente tengas que adaptar la sintaxis. Después de ejecutar estas sentencias puedes probar tu aplicación. Debería funcionar como en la figura que aparece en la sección "Propiedades de total de una colección" que puedes encontrar en la lección 12. @Calculation y totales de colección, incluso para facturas y pedidos ya existentes.

Resumen

En esta lección has aprendido cómo modificar de manera manual el esquema de la base de datos de nuestra aplicación utilizando sentencias SQL, de tal forma que no perdamos información en un ambiente de producción.

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