Parece que Hibernate comenzó a usar el tipo de datos LONG
en la versión 3.5.5 (actualizamos desde 3.2.7) en lugar de CLOB
para la propiedad de type="text"
.¿Por qué ha cambiado Hibernate para usar LONG over CLOB?
Esto está causando problemas como LONG
tipo de datos en Oracle es un viejo tipo de datos obsoletos (ver http://www.orafaq.com/wiki/LONG) que no se debe utilizar, y las tablas no puede tener más de una columna que tiene LONG
como un tipo de datos.
¿Alguien sabe por qué esto ha sido cambiado?
He tratado de establecer la propiedad de Oracle SetBigStringTryClob
true (como se sugiere en Hibernate > CLOB > Oracle :(), pero que no afecta a la asignación de tipo de datos, pero sólo internos de transferencia de datos que son irrelevantes para mi caso.
Una posible solución para esto es para anular el org.hibernate.dialect.Oracle9iDialect
:
public class Oracle9iDialectFix extends Oracle9iDialect {
public Oracle9iDialectFix() {
super();
registerColumnType(Types.LONGVARCHAR, "clob");
registerColumnType(Types.LONGNVARCHAR, "clob");
}
}
Sin embargo, este es el último recurso - anulando esta clase es el paso más cerca de la bifurcación de hibernación, que yo preferiría evitar hacerlo.
¿Alguien puede explicar por qué se hizo esto? ¿Debería plantearse como un error?
[ACTUALIZACIÓN]: He creado http://opensource.atlassian.com/projects/hibernate/browse/HHH-5569, veamos qué pasa.
¿Ha intentado utilizar una versión posterior del dialecto? Nosotros El cambio al dialecto de 10g ayudó a tontear con algo de eso. Editar: Supongo que estás usando esto para generar un ddl - ¿Es correcto? – aperkins
Estamos usando la función de Hibernate que automáticamente crea tablas bajo demanda si no estaban presentes. dicho, este cambio hace que nuestra vida sea extremadamente dolorosa ya que las tablas en las instalaciones más nuevas tendrán una estructura diferente a las tablas en instalaciones más antiguas. Gracias por su consejo, voy a echar un vistazo a 10g de dialecto mañana. – mindas