2009-07-08 30 views
10

Tôi có một cột trong cơ sở dữ liệu SQL-2005 của tôi trước kia từng là một varchar (max), nhưng nó đã được đổi thành một nvarchar (max).Làm thế nào có thể Hibernate ánh xạ dữ liệu SQL loại nvarchar (tối đa)?

Bây giờ tôi cần phải cập nhật tập tin bản đồ ngủ đông của tôi để phản ánh sự thay đổi, và đây là những gì nó được sử dụng là:

< loại element = "text" column = "Giá trị"/>

Khi tôi cố gắng để chạy các ứng dụng, các lỗi sau xuất hiện:

org.hibernate.HibernateException: loại cột sai trong [Bảng] cho giá trị cột. Tìm thấy: ntext, dự kiến: văn bản

tôi nên đặt gì trong 'loại' thuộc tính để xác lập bản đồ các cột như một nvarchar (max)?

Tôi đã thử đặt loại thành ntext, nhưng hibernate không biết đó là gì. Tôi đã thử đặt loại thành chuỗi, nhưng nó được xử lý chuỗi dưới dạng văn bản .

Trả lời

7

Tìm câu trả lời tại Tremend Tech Blog. Bạn phải viết lớp SQLServerDialect của riêng bạn, nó trông giống như sau:

Lớp này maps loại Hibernate để loại SQL, vì vậy các lớp sẽ lập bản đồ nvarchar (max) dữ liệu SQL Type để Hibernate của CLOB loại dữ liệu.

Các getTypeName phương pháp được sử dụng để trả "ntext" khi Hibernate hỏi về các kiểu dữ liệu với mã 2005 (mà hình như nó là nvarchar (max) kiểu dữ liệu).

Cuối cùng, bạn cần phải thay đổi phương ngữ bền vững ngủ đông của mình thành lớp SQLServerDialect mới này, cho phép ngủ đông để dịch các kiểu dữ liệu thành các kiểu dữ liệu SQL.

+2

tại sao bạn đăng ký cột loại COLB là tốt?và $ 1 có nghĩa là gì trong nvarchar ($ 1)? Cảm ơn –

+1

Điều này đã được một thời gian dài trước đây và tôi không thể nhớ khá, nhưng registerColumnType() ánh xạ các loại SQL để kiểu Hibernate. $ l (L, không phải # 1) là một mẫu phù hợp đại diện cho độ dài của cột nvarchar. Nếu cột nvarchar có độ dài được xác định, nó sẽ được ánh xạ tới kiểu VARCHAR. Nếu cột nvarchar có độ dài tối đa, cột này sẽ được ánh xạ tới loại CLOB. – ampersandre

+1

Xin lưu ý rằng đối với máy chủ sql 2014, tôi phải * loại bỏ * phương thức ghi đè 'getTypeName' trong mã ở trên !! – vikingsteve

0

Tôi nghĩ rằng đó là registerColumnType (Types.VARCHAR, "nvarchar ($ l)"); // l như _l_ength, không 1.

+0

là $ 1. ví dụ registerColumnType (Types.NVARCHAR, 4000, "nvarchar ($ 1)"); – Eyal

11

gì làm việc cho tôi là để đặt định nghĩa cột thực tế trong một chú thích @column:

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

Điều này cũng phù hợp với tôi. Tôi đang sử dụng nvarchar (max) trong DB và @Column (name = "colName", columnDefinition = "nvarchar") đã sửa nó. – petrsyn

+0

Cảm ơn, nó cũng làm việc cho tôi! – digz6666

1

Nó có thể được cố định bởi @Nationalized chú thích từ ngủ đông, mà đánh dấu một kiểu dữ liệu ký tự giống như một biến thể được quốc hữu hóa (NVARCHAR, NCHAR, NCLOB, v.v.).

Các vấn đề liên quan