2017-10-19 10 views
0

Je rencontre des problèmes lors de la tentative d'enregistrement de CLOB dans Oracle à l'aide de Spring Data et de l'interface CRUDRepository. Du côté de la base de données, la colonne est de type CLOB. Les chaînes de caractères inférieures à 4000 caractères sont enregistrées correctement, mais plus longtemps (ORA-01461), malgré l'annotation @Lob et le paramètre de définition de colonne dans l'annotation @Column. Je n'ai pas trouvé de solution à ce problème, car tout ce que j'ai trouvé concerne Spring JDBC Template, pas Spring Data.Comment insérer CLOB à Oracle à l'aide des données de ressort

try (ByteArrayInputStream inputStream = new ByteArrayInputStream(messageBody.getBytes(StandardCharsets.UTF_8))) { 
     message = (DeadLetterMessage) unmarshaller.unmarshal(new StreamSource(inputStream)); 
    } 

    try { 
     message = repository.save(message); 
    } catch (Throwable e) { 
     log.warn("### Failed to store message in database", e); 
     throw e; 
    } 

Biens immobiliers à persistence.xml:

<persistence-unit name="deadletter" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
    <class>com.lppsa.integration.camel.dlc.entity.DeadLetterMessage</class> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/> 
     <property name="hibernate.connection.SetBigStringTryClob" value="true"/> 
     <property name="hibernate.jdbc.batch_size" value="true"/> 
    </properties> 
</persistence-unit> 

problème est seulement avec des valeurs plus que 4000.

(...) 
@Lob 
@Basic(fetch = FetchType.LAZY) 
@Column(name = "MESSAGE_DATA", columnDefinition = "CLOB NOT NULL") 
@XmlJavaTypeAdapter(ByteArrayXmlAdapter.class) 
private byte[] messageData; 
(...) 
+0

https://stackoverflow.com/questions/2115420/cannot-save-clob-data-type-in-database-struts-spring-hibernate?rq=1 -> this ne marche pas. –

+0

Veuillez fournir un [MCVE] incluant votre code actuel. – MT0

+0

J'utilise la méthode _save_ par défaut de l'interface CRUDRepository. –

Répondre

0

problème est résolu. J'ai utilisé java.sql.Clob pour envelopper cette colonne. J'ai remplacé ByteArrayXmlAdapter par ClobXmlAdapter (qui était nécessaire pour marshaler correctement l'objet). Pour créer CLOB j'ai utilisé NonContextualLobCreator, et, pour la sérialisation - je l'ai enveloppé avec SerializableClobProxy. La création de BLOB/CLOB est décrite ici: What is the alternate for deprecated Hibernate.createClob(Reader reader, int length)