2012-04-27 12 views
5

Sto lavorando a un progetto che utilizza Oracle 10g e Grails v2.0.1.Utilizzo di Oracle 10g CLOB con Grails 2.0.1

Sto cercando di utilizzare un tipo di dati CLOB per un campo di immissione di testo nella mia classe Dominio e sembra non funzionare. Il mio primo tentativo era basata su quello che ho letto here about GORM, dove è dice di usare type: 'text', come in questo esempio:

class Address { 
    String number 
    String postCode 
    static mapping = { 
     postCode type: 'text' 
    } 
} 

Grails mappati che a un tipo di dati LONG nel mio DB, che è not desirable

secondo tentativo doveva provare type: 'clob'. È stato efficace ottenere il mio tipo di dati DB come CLOB, ma ha provocato un errore di cast di classe perché la proprietà stessa era definita come una stringa, ad esempio String postCode. (Si noti che non ho mai visto type:'clob' nella documentazione, ma ho potuto dedurre dalla classe dialetto che clob potrebbe essere un input valido lì)

Successivamente ho cercato di definire la proprietà come java.sql.Clob, cioè Clob postCode;, e che didn' lavorare affatto Nessun messaggio di errore, ma nulla è stato mantenuto persistente nel DB.

Ho fatto l'ultimo passo per mantenere l'approccio Clob, ma utilizzando una proprietà transitoria String in cui i getter/setter tentano di associare il valore di stringa temporaneo al campo Clob persistente. Ma non riesco a capire come ottenere il mio valore di stringa nel Clob. Grails non genera un errore, ma lo println() dopo il mio tentativo di assegnazione non viene mai stampato. Ho provato a utilizzare myClob.setString(1, theString) per eseguire un compito, ma senza successo.

Quindi, per farla breve, non riesco a utilizzare un Clob nel mio scenario, e mi chiedo se qualcun altro ha visto questo ed è stato in grado di superarlo. Se è così, puoi dirmi cosa potrei fare di sbagliato?

O ... c'è un modo per ignorare il tipo di dati che Grails sceglie in modo tale da costringerlo a mappare postCode type: 'text' in un CLOB? Non sono abile con Hibernate, quindi non sono sicuro di come farlo se c'è un modo.

Nota a margine: prima del nostro aggiornamento da Grails 1.3.7 a 2.0.1, sono abbastanza sicuro che lo type: 'text' abbia effettivamente eseguito il mapping su un CLOB in Oracle. Quindi questo potrebbe essere nuovo per 2.0.1.

+0

Bene in [2.0.x docs] (http://grails.org/doc/2.0.x/ref/Database%20Mapping/type.html) in realtà è scritto che il tipo nel tuo caso sarà clob, ma Non avevo ancora bisogno di usarlo, quindi non posso assicurare che funzioni su 2.0.x –

risposta

11

I think Ho trovato una risposta infilata nella documentazione su Custom Hibernate Types.

In tal caso, l'override tipo SQL della colonna utilizzando l'attributo SQLTYPE

Questo sembra funzionare.

Sembra che sia in grado di usarlo per forzare il mio tipo DB a essere CLOB mantenendo il tipo java a String. In altre parole, forse type sceglie sia un tipo di DB che un tipo Java per gestire il campo? Ma sqlType dà un po 'più granularità per specificare il tipo di DB da utilizzare.

Quindi la classe di dominio di esempio sopra dovrebbe assomigliare a questo nel mio caso:

class Address { 
    String number 
    String postCode 
    static mapping = { 
     postCode sqlType: 'clob' 
    } 
} 

ho spigolato questo da un'altra domanda StackOverflow sul tema (la domanda stessa mi clued, mentre la risposta accettata me fuorviato!):

ho passato una giornata cercando di capire tutto questo fuori, ed era incredibilmente fru strating. Quindi forse i miei appunti sull'argomento qui aiuteranno qualcun altro a evitare quell'esperienza!


E mentre io sto tenendo note qui ... questo post si è rivelata in qualche modo utile, in termini di risoluzione dei problemi come ottenere in modo più preciso le mie mappature:

Interessante il codice da quello è riprodotto qui:

//CONFIG.GROOVY (maps a custom SixDecimal type) 
grails.gorm.default.mapping = { 
    'user-type'(type: SixDecimalUserType, class: SixDecimal) 
} 
+0

Fantastico! Inserisce e recupera stringhe corrette> 4000 caratteri. – Tobia

1

Proba Bly troppo tardi, ma ho trovato davvero una semplice soluzione a questo problema: è necessario

class MyDomain{ 
    String myField 
    ... 
    static mapping = {  
    myField type:'materialized_clob'   
    } 
} 

Niente altro, scrive e legge opere come fascino! : D

Spero che aiuti. Ivan.

0

La risposta di Ivan funziona per me. MaterializedClob è il tipo JDBC Hibernate per una stringa Java.

Problemi correlati