Este código es el mismo que el de
CalculadorSiguienteNumeroParaAnyo pero usando
getClass().getSimpleName() en lugar de "DocumentoComercial". El método
getSimpleName() devuelve el nombre de la clase sin paquete, es decir, precisamente el nombre de la entidad. Será "Pedido" para
Pedido y "Factura" para
Factura. Así podremos obtener una numeración diferente para
Factura y
Pedido.
La especificación JPA establece que no puedes usar el API JPA dentro de un método de retrollamada. Por tanto, el método de arriba no es legal desde un punto de vista estricto. Pero, Hibernate (la implementación de JPA que OpenXava usa por defecto) te permite usarla en
@PrePersist. Y dado que usar JPA es la forma más fácil de hacer este cálculo, nosotros lo usamos.
Ahora borra la clase
CalculadorSiguienteNumeroParaAnyo de tu proyecto y modifica la propiedad
numero de
DocumentoComercial para que no la use:
@Column(length = 6)
// @DefaultValueCalculator(value=CalculadorSiguienteNumeroParaAnyo.class, // Quita esto
// properties=@PropertyValue(name="anyo")
// )
@ReadOnly // El usuario no puede modificar el valor
int numero;
Fíjate que además de quitar
@DefaultValueCalculator, hemos añadido la anotación
@ReadOnly. Esto significa que el usuario no puede introducir ni modificar este número. Esta es la forma correcta de hacerlo ahora dado que el número es generado al grabar el objeto, por lo que el valor que tecleara el usuario sería sobrescrito siempre.
Prueba ahora el módulo de
Factura o
Pedido, verás como el número está vacío y no es editable, y cuando grabes el documento, el número se calcula y se muestra un mensaje con el año y el número recién calculado para esa factura o pedido.
Resumen
En esta lección vimos cómo definir propiedades y valores aplicables por defecto, algo muy útil si nuestra aplicación será utilizada en ambientes multiusuario o de acceso masivo. En próxima lecciones veremos otras formas de añadir lógica de negocio, y cómo sincronizar propiedades.