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.