mapeo de dominios Groovy
-
21-09-2019 - |
Pregunta
Tengo una para guardar un informe pdf en una base de datos Oracle. tipoDatos del informe es un bytearray.
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 un RAW data_type y una lenghth de 255.
¿Cómo debería definir este campo en la clase de dominio? Debe ser definido como un BLOB?
En caso afirmativo, ¿Cómo hacer esto?
Gracias de antemano.
Solución
255 es el tamaño predeterminado proporcionado a un byte []. Especificar el tamaño máximo para el informe de limitaciones como por su exigencia. Algo así como:
static constraints = {
report(maxSize: 50000000)
}
Basado en el tamaño máximo, se establecerá el tipo de campo en DB. (MEDIUMBLOB, LONGBLOB etc.)
Otros consejos
Trate de establecer 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'
}
Aquí hay una href="http://capitalcodemonkey.blogspot.com/2008/05/mapping-document-from-byte-to-blob-in.html" rel="nofollow noreferrer"> artículo de blog que las promesas para resolver este problema. El truco parece ser la de tener un campo de tipo java.sql.Blob
, con el campo byte[]
derivado de eso y marcado como transitoria.
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
}
}