关于Java:如何使用Spring Data将CLOB插入Oracle

How to insert CLOB to Oracle using Spring Data

我在尝试使用Spring Data和CRUDRepository接口将CLOB保存到Oracle时遇到问题。 在数据库方面,列是CLOB类型。 少于4000个字符的字符串可以正确保存,但是可以保存更长的字符串-(ORA-01461)不能保存,尽管@Column注释中有@Lob注释和列定义参数。 我找不到此问题的解决方案,因为我发现的所有问题都与Spring JDBC模板有关,而不与Spring Data有关。

1
2
3
4
5
6
7
8
9
10
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中的属性:

1
2
3
4
5
6
7
8
9
<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。

1
2
3
4
5
6
7
(...)
@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name ="MESSAGE_DATA", columnDefinition ="CLOB NOT NULL")
@XmlJavaTypeAdapter(ByteArrayXmlAdapter.class)
private byte[] messageData;
(...)


问题已解决。 我使用java.sql.Clob包装该列。 我用ClobXmlAdapter替换了ByteArrayXmlAdapter(正确地编组对象是必需的)。 为了创建CLOB,我使用了NonContextualLobCreator,并且为了进行序列化,我将其与SerializableClobProxy进行了包装。 这里描述了创建BLOB / CLOB的方法:不推荐使用的Hibernate.createClob(Reader reader,int length)的替代方案是什么?