2009-09-07 16 views
7

Tengo que guardar un informe en formato PDF en Oracle DB. El dataType del informe es un byteArray.Asignación de dominios Groovy

La definición de dominio es el siguiente:

static constraints = { 
report(nullable:false) 
company(nullable:false)  
month(nullable:false)  
} 

byte[] report 
Company company 
Date month 

}

Desafortunadamente esto define en la base de datos Oracle un campo que tiene una data_type RAW y una lenghth de 255.

¿Cómo debe Defino este campo en la clase de dominio? ¿Debería definirse como un BLOB?

En caso afirmativo, ¿cómo hacer esto?

Gracias de antemano.

Respuesta

7

255 es el tamaño predeterminado proporcionado a un byte []. Especifique el tamaño máximo para el informe en restricciones según su requisito. Algo como:

static constraints = { 
    report(maxSize: 50000000) 
} 

Según el tamaño máximo, se establecerá el tipo de campo en DB. (MEDIUMBLOB, LONGBLOB etc.)

1

intente configurar explícitamente el tipo ya sea a un 'blob' o 'binario', por ejemplo, se puede añadir lo siguiente a la clase de dominio:

static mapping = { 
    report type:'blob' 
} 
1

Aquí hay una blog article que promete resolver este problema. El truco parece ser tener un campo de tipo java.sql.Blob, con el campo byte[] derivado de eso y marcado como transitorio.

1

Sobre la base de la respuesta de Michael Borgwardt, aquí es lo que he hecho para resolver este problema:

import java.sql.Blob 

import org.hibernate.lob.BlobImpl 

class Pagina { 

    Blob reportBlob 

    static mapping = { 
     reportBlob column: 'PAGI_TX_DADOS', type: 'blob' 
    } 

    def setReport(byte[] bytes) { 
     if (bytes != null) { 
      ByteArrayInputStream bais = new ByteArrayInputStream(bytes) 
      int length = bytes.length 
      reportBlob = new BlobImpl(bais,length)  
     } 
    } 

    def getReport() { 
     return reportBlob?.binaryStream 
    } 

}