2012-04-27 38 views
5

Estoy trabajando en un proyecto que usa Oracle 10g y Grails v2.0.1.Uso de Oracle 10g CLOB con Grails 2.0.1

Estoy tratando de usar un tipo de datos CLOB para un campo de entrada de texto en mi clase de dominio, y parece que no funciona. Mi primer intento se basó en lo que leo here about GORM, Donde dice utilizar type: 'text', como en este ejemplo:

class Address { 
    String number 
    String postCode 
    static mapping = { 
     postCode type: 'text' 
    } 
} 

Griales asignadas que a un tipo de datos LONG en mi DB, que es not desirable

segundo intento era probar type: 'clob'. Eso ERA efectivo al hacer que mi tipo de datos DB fuera CLOB, pero resultó en un error de conversión de clase porque la propiedad en sí misma se definió como una cadena, es decir, String postCode. (Tenga en cuenta que nunca he visto type:'clob' en la documentación, pero podría deducir de la clase dialecto que clob podría ser una entrada válida allí)

posteriormente he intentado definir la propiedad como un java.sql.Clob, es decir Clob postCode;, y que didn' t trabajo en absoluto. No hay mensajes de error, pero tampoco se siguió consiguiendo nada en el DB.

Di el paso final de mantener el enfoque Clob, pero usando una propiedad String transitoria en la que los getters/setters intentan asignar el valor transitorio de String al campo persistente de Clob. Pero no puedo encontrar la forma de obtener el valor de mi cuerda en Clob. Grails no arroja un error, pero el println() después de mi intento de asignación nunca se imprime. Intenté usar myClob.setString(1, theString) para hacer una tarea, pero sin éxito.

Para resumir, parece que no puedo usar un Clob en mi escenario, y me pregunto si alguien más ha visto esto y ha sido capaz de superarlo. Si es así, ¿puedes decirme qué podría estar haciendo mal?

O ... ¿hay alguna manera de anular el tipo de datos que Grails elige de modo que pueda obligarlo a mapear postCode type: 'text' a CLOB? No soy hábil con Hibernate, así que no estoy seguro de cómo hacerlo si hay alguna manera.

Nota al pie: antes de nuestra actualización de Grails 1.3.7 a 2.0.1, estoy bastante seguro de que el type: 'text' hizo, de hecho, el mapa a un CLOB en Oracle. Entonces esto podría ser nuevo para 2.0.1.

+0

Bueno, en [2.0.x documentos] (http://grails.org/doc/2.0.x/ref/Database%20Mapping/type.html) en realidad está escrito ese tipo en su caso será clob, pero No tuve que usar esto todavía, así que no puedo asegurar que esto esté funcionando en 2.0.x –

Respuesta

11

I think He encontrado una respuesta metida en la documentación en Custom Hibernate Types.

En ese caso, reemplace el tipo SQL de la columna usando el atributo SQLTYPE

Esto parece estar funcionando.

Parece que puedo usar eso para forzar a mi tipo de base de datos a ser CLOB mientras mantengo el tipo java en Cadena. En otras palabras, ¿quizás type elige un tipo de base de datos y un tipo de Java para manejar el campo? Pero sqlType da un poco más de granularidad para especificar el tipo de base de datos a usar.

Así la clase de dominio de ejemplo anterior debería tener este aspecto en mi caso:

class Address { 
    String number 
    String postCode 
    static mapping = { 
     postCode sqlType: 'clob' 
    } 
} 

espigué esto desde otra pregunta StackOverflow sobre el tema (la pregunta en sí me dio un indicio, mientras que la respuesta aceptada me engañó!):

pasé un día tratando de entender todo esto, y era increíblemente fru estrangular ¡Entonces tal vez mis notas sobre el tema aquí ayudarán a alguien más a evitar esa experiencia!


Y ya que estoy tomando notas aquí ... este post resultó un tanto útil en términos de solución de problemas de cómo conseguir más específico en mis asignaciones:

Interesante código de que se reproduce aquí:

//CONFIG.GROOVY (maps a custom SixDecimal type) 
grails.gorm.default.mapping = { 
    'user-type'(type: SixDecimalUserType, class: SixDecimal) 
} 
+0

¡Impresionante! Inserta y recupera cadenas correctamente> 4000 caracteres. – Tobia

1

Proba Bly demasiado tarde, pero he encontrado una solución muy sencilla a este problema: se requiere

class MyDomain{ 
    String myField 
    ... 
    static mapping = {  
    myField type:'materialized_clob'   
    } 
} 

Nada más, escribir y leer obras como encanto! : D

Espero que ayude. Ivan.

0

La respuesta de Ivan funciona para mí. MaterializedClob es el tipo Hibernate JDBC para Java String.

Cuestiones relacionadas