Hibernate + Oracle + Clob: содержимое атрибутов переключается - PullRequest
3 голосов
/ 05 июля 2010

Кто-нибудь слышал об этой ошибке раньше:

У меня есть приложение Java 5, которое использует Hibernate 3.3.2 для доступа к базе данных Oracle 10g, драйвер JDBC - это облегченный драйвер Oracle версии 10.2.0.4.0 (самая последняя версия, я думаю).Доступ к базе данных происходит во время транзакции, которая управляется с помощью AOP-инструментов Spring.Существует одна таблица базы данных, сопоставленная одному объекту Java, сопоставление выполняется с помощью аннотаций.В этом объекте есть два атрибута, которые являются CLOB в базе данных.Они помечены в соответствии с JPA «Lob» и являются строками Java.Все работает нормально, если оба атрибута не имеют значений длиной более 4000 символов: после фиксации значения включаются в базу данных, то есть атрибут A содержит значение атрибута B и наоборот.

Это не шутка!

Отладчик Eclipse сообщает мне, что сущность Java имеет правильные значения, пока транзакция не закроется (я не отлаживал обработку весенних транзакций).Эта ошибка не возникает, если оба Clob помечены аннотацией Hibernate 'Type (type = "clob") "(в этом случае они, конечно, должны быть типа java.sql.Clob, а не String).

Ответы [ 4 ]

0 голосов
/ 10 августа 2014

Единственное, что сработало для нас, - это использовать hql-запросы для обновления. Каждый запрос обновлял один CLOB (поэтому нам нужно было два отдельных запроса):

Query query = em.createQuery("update SomeTable as someTable set value = :value where id = :id");
query.setParameter("value", value);
query.setParameter("id", id);
if (query.executeUpdate() != 1) {
    throw new Exception("Value update had no effect");
}
0 голосов
/ 01 августа 2010

Тем временем я нашел решение проблемы: SQL-диалект был неправильным, кто-то установил его на Oracle9 вместо правильной версии, а именно:

name = "hibernate.dialect" value = "org.hibernate.dialect.Oracle10gDialect "

Установка правильного SQL-диалекта решает проблему: -)

0 голосов
/ 14 октября 2013

У меня точно такая же проблема. Два КЛОБА на столе. На вставке установлен только один и все нормально. При обновлении я установил второй и после фиксации значения в таблице меняются местами. Оба содержат более 4000 символов. Отладка и значения в бине верны. Печально то, что у меня уже есть org.hibernate.dialect.Oracle10gDialect в моих свойствах. (Hibernate версия 4.2.2.Final)

// UPDATE на данный момент в качестве обходного пути я установил для первого столбца значение updatable = false в аннотации JPA, чтобы при генерации запроса на обновление в режиме гибернации теперь был только один столбец CLOB. Я могу сделать это так, что в данном конкретном случае мне не нужно менять значение после вставки, но это не общее решение.

0 голосов
/ 05 июля 2010

Я не уверен на 100%, но не могли бы вы попытаться установить для свойства соединения SetBigStringTryClob значение true (см. Как легко обрабатывать CLOB в JDBC? ).

Если вы используете Spring, что-то вроде этого:

<property name="hibernateProperties">
  <props>
    <prop key="hibernate.connection.SetBigStringTryClob">true</prop>
  </props>
</property>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...