Domanda

Sto sviluppando un'applicazione che utilizza Oracle 11g, Java (Struts2) e Hibernate.

Ho tabella denominata mytemp con la colonna mytemp_id che è di tipo NUMBER (22,0).

Nel mio file mytemp.hbm.xml id è come dato seguito

<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>

Nella mia sequenza di database Oracle denominato "MYTEMP_TEMP_ID_SEQ" è stato creato e fine lavoro in Oracle.

Ora, quando provo ad inserire record utilizzando hibernate, mi dà errore seguente

org.hibernate.id.IdentifierGenerationException: questo generatore id genera lungo, intero, a breve ea stringa

Sembra che la mia sequenza ritorna Numero, hibenate considerandolo come BigDecimal, mentre la classe generatore sequece di Hibernate considerando i valori che sono lunghe, intero, a breve e la stringa solo.

Hibernate non dovrebbe avere problemi con BigDecimal. Ma penso che non hanno attuato BigDecimal per il generatore di sequenza

Uno può aiutarmi a risolvere il problema?

Grazie.

È stato utile?

Soluzione

Per essere onesto con te, non riesco a immaginare il motivo per cui si dovrebbe insistere per avere il proprio ID come BigDecimal invece che a lungo. Il valore massimo è lungo 9,223,372,036,854,775,807 che, anche se certamente è di circa un millesimo di (22) valore massimo NUMERO, in realtà dovrebbe essere abbastanza . Se si dovesse creare un milioni identificatori ogni secondo , si dovrebbe farlo per 300 mila anni al fine di esaurire la sequenza.

Detto questo, al fine di avere il vostro identificatore generato come BigDecimal sarà necessario scrivere il proprio generatore. Potete farlo estendendo SequenceGenerator built-in di Hibernate e ridefinendo il suo metodo generate(). Invece di chiamare attraverso IdentifierGeneratorFactory.get() che solo supporta lungo / int / short / String si sarebbe ottenere il valore della sequenza dal set di risultati come BigDecimal.

Sarà quindi necessario dichiara il generatore specificandone il nome completo della classe:

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

Altri suggerimenti

Hai impostato il dialetto corretta? Questo dovrebbe essere sufficiente a rendere Hibernate comprendere il risultato della sequenza.

[EDIT] Il problema è che il tipo di sequenza non corrisponde al tipo di colonna. La sequenza (come da messaggio di errore di Hibernate) può essere lanciato a lungo, intero, a breve o una stringa, mentre la sequenza restituisce un BigDecimal.

Suggerisco di specificare il tipo di colonna ID come "lungo", anche se Oracle non sa che tipo. Internamente, Hibernate dovrebbe quindi essere in grado di esprimere tutto per tutti in modo corretto.

Sicuramente. Lungo id deve essere abbastanza certo numero considerando sempre di record univoci che può generare. Il generatore particolare mera avere valori speciali potrebbe essere diverso da integer tipo o di avere il controllo sul integer digitare i valori per qualche motivo (potrebbe essere specifico progetto).

Inoltre, è generatore di database specifico come sequenza per Oracle, quindi la definizione dialact che conta anche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top