Pregunta

Estoy desarrollando una aplicación utilizando Oracle 11g, Java (struts2) y Hibernate.

He tabla denominada mytemp con mytemp_id columna que es de tipo NUMBER (22,0).

En mi archivo mytemp.hbm.xml ID es como dan a continuación

<id name="mytempId" type="big_decimal">
        <column name="MYTEMP_ID" precision="22" scale="0" />
        <generator class="sequence">
            <param name="sequence">MYTEMP_TEMP_ID_SEQ</param>
        </generator>
    </id>

En mi secuencia de base de datos Oracle llamado "MYTEMP_TEMP_ID_SEQ" se crea y funciona bien en Oracle.

Ahora cuando intento insertar registro usando Hibernate, me da error de seguimiento

org.hibernate.id.IdentifierGenerationException: este generador de id genera largo, entero, corta o cadena

Parece que como mi secuencia vuelve Número, hibenate considerándolo como BigDecimal, mientras que la clase generador sequece de hibernación teniendo en cuenta los valores que son largos, número entero, corta y de cadena única.

Hibernate no debería tener problema con BigDecimal. Pero creo que no han implementado BigDecimal para el generador de secuencia

Puede cualquiera que me ayude a resolver el problema?

Gracias.

¿Fue útil?

Solución

Para ser honesto con usted, no puedo imaginar por qué se insiste en tener su identificación como BigDecimal en lugar de tiempo. El valor máximo es largo 9,223,372,036,854,775,807 cual, aunque es cierto que se trata de una milésima de número máximo (22) de valor, en realidad debería ser suficiente . Si se va a generar un millones identificadores cada segundo , que tendría que hacer eso por 300.000 años con el fin de agotar su secuencia.

Dicho esto, con el fin de tener su identificador generado como BigDecimal tendrá que escribir su propio generador. Puede hacerlo mediante la extensión de SequenceGenerator integrado de Hibernate y anulando su método generate(). En lugar de llamar a través de IdentifierGeneratorFactory.get() que sólo admite a largo / int / corta / cadena que le obtener su valor de secuencia de conjunto de resultados como BigDecimal.

A continuación, tendrá a declarar su generador especificando su nombre completo de la clase:

<generator class="com.mypackage.BigDecimalGenerator">
  <param name="sequence">MYTEMP_TEMP_ID_SEQ</param>
</generator>

Otros consejos

¿Ha definido el dialecto correcto? Eso debería ser suficiente para que Hibernate entender el resultado de la secuencia.

[EDIT] El problema es que el tipo de su secuencia no coincide con el tipo de su columna. La secuencia (como por mensaje de error de Hibernate) puede convertirse a largo, entero, corta o cadena, mientras que su secuencia vuelve un BigDecimal.

Sugiero para especificar el tipo de la columna ID como "larga" a pesar de que Oracle no sabe que tipo. Internamente, Hibernate entonces debería ser capaz de lanzar todo para todos correctamente.

Por supuesto. Larga id debe ser suficiente siempre teniendo en cuenta el número de registros únicos que puede generar. El generador particular, mera tener valores especiales podría ser otra cosa que entero tipo o tener control sobre el entero valores de tipo por alguna razón (que podría ser un proyecto específico).

Además, el generador es específico de base de datos como la secuencia de Oracle, por lo que la definición dialact sí importa también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top