Oracle
 sql >> Base de données >  >> RDS >> Oracle

Hiberner> CLOB> Oracle :(

Merci à non sequitor pour toute l'aide. J'ai ce travail et je pense que je mettrai toutes les pièces ici pour référence future. Indépendamment de toutes les affirmations concernant la mise à niveau des pilotes et tout fonctionnerait, rien de tout cela n'a fonctionné pour moi. En fin de compte, j'ai dû implémenter un 'org.hibernate.usertype.UserType' que j'ai nommé de la même manière que tous les exemples sur le Web StringClobType. Sauf pour certaines importations, j'ai utilisé l'exemple de Utilisation de Clobs/Blobs avec Oracle et Hibernate. En ce qui me concerne, ignorez l'allégation "attention".

Il y avait un changement que j'ai dû faire pour que les fusions fonctionnent. Certaines des méthodes n'ont pas été implémentées dans l'exemple de code fourni. Eclipse l'a réparé pour moi en les supprimant. Cool, mais la méthode de remplacement doit être réellement implémentée ou toutes les fusions écraseront les données avec un null. Voici mon implémentation :

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

Je ne vais pas dupliquer l'implémentation de la classe ici, allez sur le lien ci-dessus pour le voir. J'ai utilisé le code dans la troisième case grise. Puis en haut de la classe pojo je voulais l'utiliser dans j'ai ajouté ce qui suit après les importations

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

Ensuite, pour utiliser le nouveau UserType, j'ai ajouté l'annotation à mon getter :

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

Je n'avais pas besoin de l'annotation @Lob.
Dans mon fichier persistence.xml, la déclaration persistence-unit se terminait par :

<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>

Le SetBigStringTryClob n'a jamais fonctionné pour moi et n'était pas nécessaire pour cette implémentation finale.

Ma leçon apprise est qu'en fin de compte, il est probablement préférable de rejoindre que de se battre. Cela m'aurait fait gagner trois jours.