2017-10-19 18 views
0

Spring DataおよびCRUDRepositoryインターフェイスを使用してCLOBをOracleに保存する際に問題があります。データベース側では、columnはCLOB型です。 @Lobアノテーションと@Columnアノテーションの列定義パラメータにかかわらず、4000文字より短い文字列は正しく保存されますが、長期間(ORA-01461)では保存されません。見つかったのはSpring Dataではなく、Spring JDBC Templateに関連するので、私はこの問題の解決策を見つけることができませんでした。 persistence.xmlでSpringデータを使用してOracleにCLOBを挿入する方法

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-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://stackoverflow.com/questions/2115420/cannot-save-clob-data-type-in​​-database-struts-spring-hibernate?rq=1-> this動作しません。 –

+0

現在のコードを含む[MCVE]を入力してください。 – MT0

+0

私はCRUDRepositoryインターフェースからデフォルトの_save_メソッドを使用しています。 –

答えて

0

問題が解決されているよりも長い値のみです。私はその列をラップするためにjava.sql.Clobを使用しました。 ByteArrayXmlAdapterをClobXmlAdapterに置き換えました(オブジェクトを正しく整列化するために必要でした)。 CLOBを作成するために、私はNonContextualLobCreatorを使用していましたが、シリアライゼーションにはSerializableClobProxyでラップしました。 BLOB/CLOBの作成については、ここをクリックしてください。What is the alternate for deprecated Hibernate.createClob(Reader reader, int length)

関連する問題