如何使用Spring数据将CLOB插入到Oracle

如何使用Spring数据将CLOB插入到Oracle

问题描述:

我尝试使用Spring Data和CRUDRepository接口将CLOB保存到Oracle时出现问题。在数据库方面,列是CLOB类型的。尽管@Column注释中的@Lob批注和列定义参数尽管保存正确,但长度不超过4000个字符的字符串 - 不是(ORA-01461)。我找不到这个问题的解决方案,因为我发现的所有内容都与Spring JDBC模板有关,而不是Spring Data。如何使用Spring数据将CLOB插入到Oracle

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

属性在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> 

问题只与价值超过4000

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

https://*.com/questions/2115420/cannot-save-clob-data-type-in​​-database-struts-spring-hibernate?rq=1 - > this不起作用。 –

+0

请提供包含您当前代码的[MCVE]。 – MT0

+0

我使用CRUDRepository接口的默认_save_方法。 –

问题得到解决。我使用java.sql.Clob来包装该列。我用ClobXmlAdapter替换了ByteArrayXmlAdapter(这是正确编组对象所需的)。为了创建CLOB,我使用了NonContextualLobCreator,并且为了序列化 - 我用SerializableClobProxy包装了它。在这里描述创建BLOB/CLOB:What is the alternate for deprecated Hibernate.createClob(Reader reader, int length)