sql >> Base de Datos >  >> RDS >> Oracle

Hibernate> CLOB> Oráculo :(

Gracias a non sequitor por toda la ayuda. Tengo este trabajo y creo que pondré todas las piezas aquí para futuras referencias. Independientemente de todas las afirmaciones sobre la actualización de los controladores y todo funcionaría, nada de eso funcionó para mí. Al final tuve que implementar un 'org.hibernate.usertype.UserType' lo nombré igual que todos los ejemplos en la web StringClobType. Excepto por algunas importaciones, utilicé el ejemplo de Uso de Clobs/Blobs con Oracle e Hibernate. En lo que a mí respecta, ignore el reclamo de "cuidado".

Tuve que hacer un cambio para que las fusiones funcionaran. Algunos de los métodos no se implementaron en el ejemplo de código proporcionado. Eclipse me lo arregló apagándolos. Genial, pero el método de reemplazo debe implementarse realmente o todas las fusiones sobrescribirán los datos con un valor nulo. Aquí está mi implementación:

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

No duplicaré la implementación de la clase aquí, vaya al enlace anterior para verlo. Usé el código en el tercer cuadro gris. Luego, en la parte superior de la clase pojo en la que quería usarlo, agregué lo siguiente después de las importaciones

...  
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 {  
...  
}   

Luego, para usar el nuevo UserType, agregué la anotación a mi getter:

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

No necesitaba la anotación @Lob.
En mi persistence.xml, la declaración de la unidad de persistencia terminó luciendo así:

<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 nunca funcionó para mí y no fue necesario para esta implementación final.

Mi lección aprendida es que, al final, probablemente sea mejor unirse que luchar. Me habría ahorrado tres días.