2009-09-07 10 views
7

Mam do zapisania raportu PDF do bazy danych Oracle. Typ danych dataType raportu to byteArray.Mapowanie domeny Groovy

Definicja domeny jest w następujący sposób:

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

byte[] report 
Company company 
Date month 

}

Niestety ta określa w Oracle DB pole który ma RAW DATA_TYPE i lenghth 255.

jak powinny Czy to pole jest zdefiniowane w klasie domeny? Należy zdefiniować jako BLOB?

Jeśli tak, jak to zrobić?

Z góry dziękuję.

Odpowiedz

7

255 to domyślny rozmiar podany w bajcie []. Określ maksymalny rozmiar raportu w wiązaniach zgodnie z wymaganiami. Coś jak:

static constraints = { 
    report(maxSize: 50000000) 
} 

W oparciu o maksymalny rozmiar, typ pola w DB zostanie ustawiony. (Mediumblob, longblob itp)

1

Spróbuj jawnie ustawić typ albo do „blob” lub „binarny”, na przykład można dodać następujące klasy domeny:

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

Oto blog article która obiecuje rozwiązać ten problem. Wydaje się, że trik ma pole typu java.sql.Blob, z polem byte[] wyprowadzonym z tego i oznaczonym jako przejściowe.

1

podstawie Michael Borgwardt odpowiedź, tutaj jest to, co zrobiłem, aby rozwiązać ten problem:

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 
    } 

}