2009-07-08 11 views
10

Ho una colonna nel mio database SQL-2005, che era un varchar (max), ma è stato cambiato a un nvarchar (max).Come può Hibernate mappare il tipo di dati SQL nvarchar (max)?

Ora ho bisogno di aggiornare il mio file di mapping Hibernate per riflettere il cambiamento, e questo è ciò che ha usato per essere:

< tipo di elemento = colonna "testo" = "valore"/>

Quando provo ad eseguire l'applicazione, viene visualizzato il seguente errore:

org.hibernate.HibernateException: sbagliato tipo di colonna in [Tabella] per la colonna Valore. Trovato: ntext, prevede: il testo

Cosa devo mettere nel 'tipo' attribuire a mappare correttamente la colonna come un nvarchar (max)?

Ho provato a impostare il tipo su ntext, ma l'ibernazione non sapeva cosa fosse. Ho provato a impostare il tipo su stringa, ma ha trattato stringa come testo tipo.

risposta

7

Ha trovato la risposta allo Tremend Tech Blog. Devi scrivere la propria classe SQLServerDialect, sembra qualcosa di simile:

Questa classe Mappe tipi di Hibernate per tipi SQL, quindi la classe sarà mappare la nvarchar (max) tipo di dati SQL di Hibernate di CLOB tipo di dati.

Il getTypeName metodo viene utilizzato per restituire "ntext" quando Hibernate chiede il tipo di dati con il codice 2005 (che sembra come se fosse la nvarchar (max) tipo di dati).

Infine, è necessario modificare il dialetto di persistenza di ibernazione in questa nuova classe SQLServerDialect, che consente a Hibernate di convertire i tipi di dati in tipi di dati SQL.

+2

perché hai registrato colonna COLB come bene?e cosa significa questo $ 1 in nvarchar ($ 1)? Grazie –

+1

Questo è stato molto tempo fa e non riesco a ricordare, ma registerColumnType() associa i tipi SQL ai tipi di Hibernate. $ l (L, non # 1) è un modello di corrispondenza che rappresenta la lunghezza della colonna nvarchar. Se la colonna nvarchar ha una lunghezza definita, verrà mappata al tipo VARCHAR. Se la colonna nvarchar ha lunghezza massima, verrà mappata al tipo CLOB. – ampersandre

+1

Si noti che per sql server 2014 ho dovuto * rimuovere * il metodo sovrascritto 'getTypeName' nel codice qui sopra !! – vikingsteve

0

Penso che sia registerColumnType (Types.VARCHAR, "nvarchar ($ l)"); // l come _l_ength, non 1.

+0

è $ 1. ad esempio registerColumnType (Types.NVARCHAR, 4000, "nvarchar ($ 1)"); – Eyal

11

Quello che ha funzionato per me è quello di mettere la definizione di colonna effettiva in un'annotazione di @Column:

@Column(name="requestXml", columnDefinition = "ntext") 
private String request; 
+3

Questo ha funzionato anche per me. Sto usando nvarchar (max) in DB e @Column (name = "colName", columnDefinition = "nvarchar") risolto. – petrsyn

+0

Grazie, ha funzionato anche per me! – digz6666

1

Può essere fissato con @Nationalized annotazione da Hibernate, che contrassegna un tipo di dati carattere come una variante nazionalizzata (NVARCHAR, NCHAR, NCLOB, ecc.).

Problemi correlati