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)的替代方案是什么?