Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Hibernar> CLOB> Oracle :(


Obrigado ao non sequitor por toda a ajuda. Eu tenho isso funcionando e acho que vou colocar todas as peças aqui para referência futura. Independentemente de todas as alegações sobre a atualização dos drivers e tudo funcionaria, nada disso funcionou para mim. No final eu tive que implementar um 'org.hibernate.usertype.UserType' eu nomeei o mesmo que todos os exemplos na web StringClobType. Salve algumas importações, usei o exemplo de Usando Clobs/Blobs com Oracle e Hibernate. No que me diz respeito, ignore a alegação de "cuidado".

Houve uma mudança que tive que fazer para que as mesclagens funcionassem. Alguns dos métodos não foram implementados no exemplo de código fornecido. O Eclipse consertou isso para mim, apagando-os. Legal, mas o método de substituição precisa ser realmente implementado ou todas as mesclagens substituirão os dados por um nulo. Aqui está minha implementação:
public Object replace(Object newValue, Object existingValue, Object arg2)throws HibernateException {
    return newValue;
}

Não vou duplicar a implementação da classe aqui acesse o link acima para vê-la. Eu usei o código na terceira caixa cinza. Então, no topo da classe pojo, eu queria usá-lo, adicionei o seguinte após as importações
...  
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 {  
...  
}   

Então, para usar o novo UserType, adicionei a anotação ao meu getter:
@Type(type="clob")
@Column(name="COMMENT_DOC")
public String getDocument(){
    return get("Document");
}

Eu não precisava da anotação @Lob.
No meu persistence.xml a declaração persistence-unit terminava assim:
<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>

O SetBigStringTryClob nunca funcionou para mim e não foi necessário para esta implementação final.

Minha lição aprendida é que no final provavelmente é melhor se juntar do que lutar. Teria me salvado três dias.