sql server 2005 - nchar - ¿Cómo puede Hibernate asignar el tipo de datos SQL nvarchar(max)?
tipos de datos en sql server pdf (4)
Creo que es registerColumnType (Types.VARCHAR, "nvarchar ($ l)"); // me gusta _l_ength, no 1.
Tengo una columna en mi base de datos SQL-2005 que solía ser varchar (max) , pero se ha cambiado a nvarchar (max) .
Ahora necesito actualizar mi archivo de mapeo de hibernación para reflejar el cambio, y esto es lo que solía ser:
<element type = "text" column = "Value" />
Cuando intento ejecutar la aplicación, aparece el siguiente error:
org.hibernate.HibernateException: tipo de columna incorrecta en [Table] para valor de columna. Encontrado: ntext, esperado: texto
¿Qué debería poner en el atributo ''tipo'' para mapear correctamente la columna como un nvarchar (máximo) ?
Intenté configurar el tipo a ntext , pero hibernate no sabía qué era eso. Intenté configurar el tipo de letra para la cadena , pero trataba la cadena como un tipo de texto .
Encontré la respuesta en Tremend Tech Blog . Tienes que escribir tu propia clase SQLServerDialect, se ve más o menos así:
public class SQLServerNativeDialect extends SQLServerDialect {
public SQLServerNativeDialect() {
super();
registerColumnType(Types.VARCHAR, "nvarchar($l)");
registerColumnType(Types.CLOB, "nvarchar(max)");
}
public String getTypeName(int code, int length, int precision, int scale) throws HibernateException {
if(code != 2005) {
return super.getTypeName(code, length, precision, scale);
} else {
return "ntext";
}
}
}
Esta clase asigna los tipos de Hibernate a los tipos de SQL, por lo que la clase asignará el tipo de datos SQL de nvarchar (máximo) al tipo de datos CLOB de Hibernate.
El método getTypeName se usa para devolver "ntext" cuando Hibernate pregunta sobre el tipo de datos con el código 2005 (que parece ser el tipo de datos nvarchar (max)).
Finalmente, debe cambiar su dialecto de persistencia de hibernación a esta nueva clase SQLServerDialect, que permite que hibernate traduzca tipos de datos a tipos de datos SQL.
Lo que funcionó para mí es poner la definición de la columna real en una anotación @Column:
@Column(name="requestXml", columnDefinition = "ntext")
private String request;
Se puede arreglar mediante la anotación @Nationalized
from hibernate, que marca un tipo de datos de carácter como una variante nacionalizada (NVARCHAR, NCHAR, NCLOB, etc.).