2009-09-07 7 views
7

Je dois enregistrer un rapport PDF dans une base de données Oracle. Le type de données du rapport est un byteArray.Mappage de domaine Groovy

La définition de domaine est la suivante:

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

byte[] report 
Company company 
Date month 

}

Malheureusement, cela définit dans le Oracle DB un champ qui a une RAW data_type et un lenghth de 255.

Comment devrait Je définis ce champ dans la classe de domaine? Devrait être défini comme un BLOB?

Si oui, comment faire?

Merci d'avance.

Répondre

7

255 est la taille par défaut fournie à un octet []. Spécifiez la taille maximale du rapport dans les contraintes selon vos besoins. Quelque chose comme:

static constraints = { 
    report(maxSize: 50000000) 
} 

Basé sur la taille maximale, le type de champ dans DB sera défini. (MEDIUMBLOB, LONGBLOB etc.)

1

Essayez de spécifier explicitement le type soit un « blob » ou « binaire », par exemple, vous pouvez ajouter ce qui suit à la classe de domaine:

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

Voici une blog article qui promet de résoudre ce problème. L'astuce semble être d'avoir un champ de type java.sql.Blob, avec le champ byte[] dérivé de cela et marqué comme transitoire.

1

Sur la base de réponse Michael Borgwardt, voici ce que je l'ai fait pour résoudre ce problème:

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 
    } 

}