2010-09-15 21 views
12

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.

+0

¿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

+0

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

Respuesta

4

Parece que la resolución de este problema es utilizar materialized_clob, al menos eso es lo que Gail Badner dice en HHH-5569.

Esto no me ayuda para nada (y dejé comentarios relevantes sobre eso) pero podría ser útil para otra persona aquí.De todos modos el error es rechazado y hay muy poco que pueda hacer al respecto, pero utilizar el dialecto overriden :(

+0

¡Gracias! Esta sugerencia me ayudó a resolver mi problema de mapeo postgreSQL. Ahora puedo reasignar materialized_clobs al tipo que quiero (TextType en mi caso). – Wytze

3

¿Alguien puede explicar por qué se hizo esto? ¿Debería plantearse esto como un error?

Esto se ha hecho para HHH-3892 - mejorar el apoyo a LONGVARCHAR correlación de SQL y CLOB a String de Java, SQL LONGVARBINARY y BLOB de bytes de Java [] (actualización de la documentación es seguido por HHH-4878).

Y de acuerdo con el mismo problema, el comportamiento anterior era incorrecto.

(NOTA: Actualmente, org.hibernate.type.TextType asigna incorrectamente "texto" a java.sql.Types.CLOB; este problema se solucionará por este problema y actualizado en dialectos de base de datos)

Siempre puede plantear un problema, pero en resumen, entiendo que debe usar type="clob" si desea obtener la propiedad asignada a CLOB.

PD: Proporcionar su propio Dialect y declararlo en su configuración de Hibernate (que no tiene nada que ver con un tenedor) es en mi humilde opinión no es una solución a largo plazo.

+1

Para cambiar todas las asignaciones para usar type = "clob" es una mala idea. Primero, esto afectaría las tablas en todas las otras bases de datos que admitimos, y requeriría grandes cantidades de pruebas. En segundo lugar, el campo en las otras bases de datos se puede mapear a otro tipo (no necesariamente clob) que es más apropiado para ellos. Y, por último, esto no resuelve el problema. ¿De qué sirve empezar a usar un tipo que es inferior? – mindas

+1

@mindas Haga la pregunta a los desarrolladores de Hibernate. Pero extender el dialecto parece ser tu mejor opción entonces (y esto realmente no tiene nada que ver con un tenedor). –

+0

Gracias, Pascal, he planteado un problema (también actualicé esta publicación). – mindas

Cuestiones relacionadas