2009-07-08 10 views
10

Mam kolumnę w mojej bazy danych SQL-2005, które kiedyś varchar (max), ale został zmieniony na nvarchar (max).W jaki sposób hibernować można mapować nvarchar (max) typu danych SQL?

Teraz trzeba zaktualizować plik mapowania hibernacji w celu odzwierciedlenia zmian, i to, co było kiedyś:

< typ elementu = "text" column = "Wartość"/>

Kiedy próbuję uruchomić aplikację, pojawia się następujący błąd:

org.hibernate.HibernateException: Niewłaściwy typ kolumny w tabeli [] w kolumnie Wartość. Znaleziono: ntext, oczekiwano: text

Co należy umieścić w atrybutu 'typ', aby poprawnie odwzorować kolumny jako nvarchar (max)?

Próbowałem ustawić typ na ntext, ale hibernacja nie wiedział, co to było. Próbowałem ustawić ten typ na string, ale potraktowałem string jako typ tekst.

Odpowiedz

7

Znaleziono odpowiedź pod numerem Tremend Tech Blog. Musisz napisać własną klasę SQLServerDialect, wygląda mniej więcej tak:

Ta klasa mapuje typy hibernacji do typów SQL, więc klasa mapowanie nvarchar (max) SQL Typ danych do Hibernate CLOB typ danych.

getTypeName metoda służy do powrotu „ntext” podczas hibernacji prosi o rodzaju danych z kodem 2005 (który wygląda jak jest to nvarchar (max) typ danych).

Wreszcie, należy zmienić swój dialekt trwałości hibernacji na tę nową klasę SQLServerDialect, która umożliwia hibernacji tłumaczenie typów danych na typy danych SQL.

+2

dlaczego zarejestrowałeś również typ kolumny COLB?i co ten 1 dolar oznacza w nvarchar (1 $)? Dzięki –

+1

To było dawno temu i nie pamiętam, ale registerColumnType() odwzorowuje typy SQL na typy Hibernacji. $ l (L, nie # 1) to pasujący wzorzec, który reprezentuje długość kolumny nvarchar. Jeśli kolumna nvarchar ma określoną długość, zostanie odwzorowana na typ VARCHAR. Jeśli kolumna nvarchar ma maksymalną długość, zostanie odwzorowana na typ CLOB. – ampersandre

+1

Należy pamiętać, że dla serwera sql 2014 musiałem * usunąć * nadpisaną metodę 'getTypeName' w powyższym kodzie !! – vikingsteve

0

Myślę, że jest to registerColumnType (Types.VARCHAR, "nvarchar ($ l)"); // l jak _l_ength, nie 1.

+0

to 1 USD. na przykład registerColumnType (Types.NVARCHAR, 4000, "nvarchar ($ 1)"); – Eyal

11

Co pracował dla mnie jest wprowadzenie rzeczywistej definicji kolumny w @Column adnotacji:

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

To działało również dla mnie. Używam nvarchar (max) w DB i @Column (name = "colName", columnDefinition = "nvarchar") naprawiłem to. – petrsyn

+0

Dzięki, to działało również dla mnie! – digz6666

1

To może być ustalone @Nationalized adnotacji z hibernacji, że oznacza typ danych znakowych, taki jak znacjonalizowany wariant (NVARCHAR, NCHAR, NCLOB itd.).

Powiązane problemy