Oracle
 sql >> Database >  >> RDS >> Oracle

Sospensione> CLOB> Oracle :(

Grazie a non sequitor per tutto l'aiuto. Ho questo lavoro e credo che metterò tutti i pezzi qui per riferimento futuro. Indipendentemente da tutte le affermazioni sull'aggiornamento dei driver e tutto avrebbe funzionato, non ha funzionato per me. Alla fine ho dovuto implementare un 'org.hibernate.usertype.UserType' l'ho chiamato come tutti gli esempi sul web StringClobType. Salvo alcune importazioni, ho usato l'esempio di Using Clobs/Blobs con Oracle e Hibernate. Per quanto mi riguarda, ignora l'affermazione "attenzione".

C'era una modifica che dovevo apportare per far funzionare le unioni. Alcuni dei metodi non sono stati implementati nell'esempio di codice fornito. Eclipse ha risolto per me eliminandoli. Fantastico, ma il metodo di sostituzione deve essere effettivamente implementato o tutte le unioni sovrascriveranno i dati con un valore nullo. Ecco la mia implementazione:

public Object replace(Object newValue, Object existingValue, Object arg2)throws HibernateException {
    return newValue;
}

Non duplicherò l'implementazione della classe qui, vai al link sopra per vederlo. Ho usato il codice nella terza casella grigia. Quindi nella parte superiore della classe pojo in cui volevo usarlo ho aggiunto quanto segue dopo le importazioni

...  
import org.hibernate.annotations.Type;  
import org.hibernate.annotations.TypeDefs;  
import org.hibernate.annotations.TypeDef;  

@TypeDefs({  
    @TypeDef(  
        name="clob",  
        typeClass = foo.StringClobType.class  
    )  
})  
@Entity  
@Table(name="EA_COMMENTS")  
public class Comment extends SWDataObject implements JSONString, Serializable {  
...  
}   

Quindi per utilizzare il nuovo UserType ho aggiunto l'annotazione al mio getter:

@Type(type="clob")
@Column(name="COMMENT_DOC")
public String getDocument(){
    return get("Document");
}

Non avevo bisogno dell'annotazione @Lob.
Nel mio persistence.xml la dichiarazione dell'unità di persistenza finiva come:

<persistence-unit name="###" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
        <property name="hibernate.archive.autodetection" value="class"/> 
        <property name="hibernate.connection.password" value="###" />
        <property name="hibernate.connection.username" value="###" />
        <property name="hibernate.connection.url" value="jdbc:oracle:thin:@server.something.com:1521:###"/>
        <property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver"/>
        <property name="hibernate.default_schema" value="###" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect" />
        <property name="hibernate.c3p0.min_size" value="5" />
        <property name="hibernate.c3p0.max_size" value="100" />
        <property name="hibernate.c3p0.timeout" value="300" />
        <property name="hibernate.c3p0.max_statements" value="50" />
        <property name="hibernate.c3p0.idle_test period" value="3000" />
        <property name="hibernate.c3p0.idle_connection_test_period" value="300" />
        <property name="show_sql" value="false" />
        <property name="format_sql" value="false" />
        <property name="use_sql_comments" value="false" />
        <property name="hibernate.jdbc.batch_size" value="0"/>
    </properties>
</persistence-unit>

SetBigStringTryClob non ha mai funzionato per me e non era necessario per questa implementazione finale.

La lezione che ho imparato è che alla fine è probabilmente meglio unirsi che combattere. Mi avrebbe risparmiato tre giorni.