Не удается сохранить тип данных clob в базе данных (Struts, Spring, Hibernate) - PullRequest
1 голос
/ 22 января 2010
@Column(name="transpired")
@Lob
private String transpired;
public String getTranspired() {
    return transpired;
}
public void setTranspired(String transpired) {
    this.transpired = transpired;
}

Я попытался использовать следующий код в нашем классе моделей. Прозрачным является поле с длинными текстовыми сообщениями (отчетами). При просмотре «отчета» он извлекает данные из базы данных и корректно отображает их в нашем пользовательском интерфейсе. Однако, когда я сохраняю (после редактирования или создания) отчет, поле сохранения в базе данных (ноль).

Есть идеи о том, как сохранить длинные тексты? Ранее мы использовали varchar2 (4000), но в большинстве отчетов более 4000 символов.

Спасибо.

EDIT: Я использую Oracle 10g. Тип столбца - CLOB.

Ответы [ 3 ]

4 голосов
/ 25 января 2010

Тонкие драйверы POS , которые поставляет Oracle, хорошо известны для автоматической и автоматической отмены CLOB-полей, когда вы пытаетесь сохранить более 4 КБ (сохранение более 4 КБ, что удивительно для cLob). Однако предполагается, что будет работать при использовании стандартных API-интерфейсов - что делает Hibernate - с драйвером JDBC Oracle 10g (см. Обработка сгустков в Oracle 10g ). Удивительно, что многие потоки (например, этот ) упоминают аналогичную проблему со старыми версиями тонкого драйвера Oracle 10g, поэтому убедитесь, что вы используете Драйверы Oracle 10g Release 2 (возьмите самый последний ojdbc14.jar, то есть 10.2.0.4) или позже .

Обратите внимание, что Oracle имеет ограничение 32 КБ для CLOB . Чтобы преодолеть это ограничение, вам нужно установить для свойства соединения SetBigStringTryClob значение true. Согласно различным источникам, вам также необходимо отключить пакетную обработку JDBC (т.е. установить batch_size в 0).

Для этого добавьте следующие свойства в hibernate.cfg.xml (или в конфигурацию Spring).

<!-- Tell Oracle to allow CLOBs larger than 32K -->
<property name="hibernate.connection.SetBigStringTryClob">true</property>
<property name="hibernate.jdbc.batch_size">0</property>
0 голосов
/ 16 мая 2013

Если вы хотите вставить данные через Hibernate, добавьте этот код ниже в ваши источники XML

<property name="hibernate.connection.SetBigStringTryClob">true</property>
 <property name="hibernate.jdbc.batch_size">0</property>

или

<prop key="hibernate.connection.SetBigStringTryClob">true</prop>
 <prop key="hibernate.jdbc.batch_size">0</prop>

Если вы заинтересованы в добавлении через JDBC, добавьте следующий код в ваш источник данных, скажем, Oracle-ds.xml для JBOSS

<connection-property name="SetBigStringTryClob">true</connection-property> 

Убедитесь, что вы используете последнюю версию ojdbc14.jar и для соединения JDBC, а некоторые jar-файлы, такие как classes12.jar, препятствуют сохранению огромного clob. Поэтому замените Class12.jar на ojdbc14.jar

Это сработало для меня.

0 голосов
/ 22 января 2010

Используя oracle9i, я столкнулся с той же проблемой и не смог ее решить, мне пришлось делать это вручную с помощью JDBC, однако в JPA это было просто. Я не знаю, решили ли они это в спящем режиме или нет, это было полтора года назад: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...