2012-06-08 59 views
8

Estoy usando la API javax.persistence y Hibernate para crear anotaciones y persistir entidades y sus atributos en una base de datos Oracle 11g Express.La precisión BigDecimal no persistió con las anotaciones JPA

que tienen el atributo siguiente en una entidad:

@Column(precision = 12, scale = 9) 
private BigDecimal weightedScore; 

El objetivo es que persista un valor decimal con un máximo de 12 dígitos y un máximo de 9 de esos dígitos a la derecha del punto decimal.

Después de calcular weightedScore, el resultado es 0.1234, pero una vez que confirmo la entidad con la base de datos Oracle, el valor se muestra como 0.12.

Puedo ver esto usando un objeto EntityManager para consultar la entrada o visualizándola directamente en la interfaz de Oracle Application Express (Apex) en un navegador web.

¿Cómo debo anotar mi atributo BigDecimal por lo que la precisión se conserva correctamente?

Nota: utilizamos una base de datos HSQL en memoria para ejecutar nuestras pruebas unitarias, y no experimenta el problema con la falta de precisión, con o sin la anotación @Column.

Actualización:

En cuanto a la descripción de la tabla, la definición de la columna de weightedScore es NUMBER(19, 2). Ahora también he intentado cambiar la anotación a @Column(columnDefinition="Number(12, 9)"), pero esto no ha tenido ningún efecto. ¿Alguien sabe por qué Oracle no responde a estas anotaciones?

Respuesta

5

he encontrado la respuesta. ¡Hurra!

que ha intentado ejecutar la siguiente consulta a través de la interfaz de Oracle Apex:

alter table NODE modify (WEIGHTEDSCORE NUMBER(12, 9));

he recibido un error que indica que una columna que contiene datos no puede ser modificado para tener menos precisión o menor escala. Este fue mi problema!

Como estaba intentando alterar la tabla con los datos existentes, tuve que soltar la tabla y volver a inicializarla, o bien modificar la columna para tener más precisión y escala.

que intentaron la siguiente consulta con el éxito:

alter table NODE modify (WEIGHTEDSCORE NUMBER(26, 9));

El razonamiento es que quiero añadir 7 lugares de precisión a la derecha del punto decimal, por lo que estoy añadiendo 7 a la precisión global de compensar el aumento en la escala. De esta forma, la columna puede mantener toda la precisión existente a la izquierda del decimal al tiempo que agrega precisión en el lado derecho.

Cuestiones relacionadas