2009-09-07 10 views
7

Ich habe eine PDF-Bericht in eine Oracle DB zu speichern. Der Datentyp des Berichts ist ein ByteArray.Groovy Domain Mapping

Die Domain Definition lautet wie folgt:

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

byte[] report 
Company company 
Date month 

}

Leider ist diese definiert in der Oracle-DB ein Feld die 255.

Wie sollte ein RAW data_type und lenghth von hat Ich definiere dieses Feld in der Domain-Klasse? Sollte als BLOB definiert werden?

Wenn ja, wie geht das?

Vielen Dank im Voraus.

Antwort

7

255 ist die Standardgröße für ein Byte []. Geben Sie die maximale Größe für den Bericht in Einschränkungen gemäß Ihrer Anforderung an. Etwas wie:

static constraints = { 
    report(maxSize: 50000000) 
} 

Basierend auf der maximalen Größe wird der Feldtyp in der DB festgelegt. (MEDIUMBLOB LONGBLOB etc.)

1

Versuchen Sie, explizit den Typ entweder ein ‚Blob‘ oder ‚binary‘, zum Beispiel Sie die folgenden Funktionen der Domäne Klasse hinzufügen:

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

Hier ist ein blog article, die dieses Problem zu lösen verspricht. Der Trick scheint zu sein, ein Feld vom Typ java.sql.Blob zu haben, wobei das Feld byte[] davon abgeleitet ist und als transient markiert ist.

1

Basierend auf Michael Borgwardt Antwort, hier ist das, was ich tat, um dieses Problem zu lösen:

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 
    } 

}