2009-07-08 19 views
10

Ich habe eine Spalte in meiner SQL-2005-Datenbank, die einen varchar (max) früher, aber es zu einem nvarchar (max) wurde geändert.Wie kann Hibernate den SQL-Datentyp nvarchar (max) zuordnen?

Jetzt muss ich meine Hibernate Mapping-Datei aktualisieren, um die Änderung zu reflektieren, und das ist, was es früher war:

< Element type = "text" column = "Value"/>

Wenn ich versuche, die Anwendung auszuführen, wird die folgende Fehlermeldung:

org.hibernate.HibernateException: falschen Spaltentyp in [Tabelle] für Spalt Wert. Gefunden: ntext- erwartet: text

Was soll ich in dem 'Typ' setze Attribut korrekt die Spalte als nvarchar (max) zur Karte?

Ich habe versucht, den Typ auf ntext, aber Hibernate wusste nicht, was das war. Ich habe versucht, den Typ auf Zeichenfolge, aber es behandelt Zeichenfolge als Text Typ.

Antwort

7

Die Antwort gefunden unter Tremend Tech Blog. Sie haben eine eigene SQLServerDialect Klasse zu schreiben, sieht es so etwas wie diese:

Diese Klasse abbildet Typen SQL-Typen von Hibernate, so dass die Klasse des nvarchar (max) SQL-Datentyp Hibernate Karte CLOB Datentyp.

Die getTypeName Methode wird verwendet, um zurückzukehren „ntext“, wenn Hibernate den Datentyp fragt mit Code 2005 (wie sieht es die nvarchar (max) Datentyp ist).

Schließlich müssen Sie den Persistenzdialekt für den Ruhezustand in diese neue SQLServerDialect-Klasse ändern, mit der Hibernate Datentypen in SQL-Datentypen umwandeln kann.

+2

Warum haben Sie auch den Spaltentyp COLB registriert?und was bedeutet $ 1 in nvarchar ($ 1)? Danke –

+1

Das war eine lange Zeit und ich kann mich nicht mehr genau erinnern, aber registerColumnType() ordnet SQL-Typen Hibernate-Typen zu. $ l (L, nicht # 1) ist ein übereinstimmendes Muster, das die Länge der nvarchar-Spalte darstellt. Wenn die nvarchar-Spalte eine definierte Länge hat, wird sie dem VARCHAR-Typ zugeordnet. Wenn die nvarchar-Spalte die maximale Länge hat, wird sie dem CLOB-Typ zugeordnet. – ampersandre

+1

Bitte beachten Sie, dass ich für den SQL Server 2014 * die überschriebene Methode 'getTypeName' im obigen Code entfernen musste !! – vikingsteve

0

Ich denke, es ist registerColumnType (Types.VARCHAR, "nvarchar ($ l)"); // l wie _l_ength, nicht 1.

+0

ist es $ 1. zum Beispiel registerColumnType (Types.NVARCHAR, 4000, "nvarchar ($ 1)"); – Eyal

11

Was für mich gearbeitet ist, die tatsächliche Spaltendefinition in einer @Column Anmerkung zu setzen:

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

Das hat auch für mich funktioniert. Ich benutze nvarchar (max) in DB und @Column (name = "colName", columnDefinition = "nvarchar") repariert es. – petrsyn

+0

Danke, es hat auch für mich funktioniert! – digz6666

1

Es kann durch @Nationalized Anmerkung aus dem Ruhezustand festgelegt werden, dass markiert einen Zeichendatentyp wie eine verstaatlichte Variante (NVARCHAR, NCHAR, NCLOB usw.).