Hibernate / Spring HibernateTemplate.findByCriteria (Deatched Criteria dc) выполняет обновление sql при просмотре - PullRequest
3 голосов
/ 21 марта 2012

Я пытаюсь выполнить поиск по заданным критериям.В этом представлении есть несколько полей для нескольких различных объектов в моем приложении, которые пользователь может захотеть найти.

Когда я ввожу имя объекта, который хочу найти, я добавляю ограничение для поля имени в отсоединенные критерии перед вызовом .findByCriteria().Это заставляет .findByCriteria() получить список результатов с именем, которое я ищу.

Также, когда я просматриваю свой журнал, я вижу, что hibernate вызывает select statment.

Я добавил еще одну сущность в мое представление с несколькими полями для поиска.Когда я пытаюсь найти поле, связанное с этой новой сущностью, в моем журнале появляется исключение.

Когда я просматриваю свой журнал с исключением, я вижу, что hibernate вызывает вызов select статистики сupdate оператор сразу после select (я не пытаюсь обновить запись, просто получить ее в списке).

Так почему hibernate вызывает обновление, когда я звоню .findByCriteria() для моегоновый объект?

org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)

SQL, который выполняется:

Hibernate:

    select
    * 
from
    ( select
        this_.SEARCH_ID as SEARCH1_35_0_,
        this_.ST_NM as ST24_35_0_ 
    from
        SEARCH_RESULT this_ 
    where
        this_.LOAN_TYPE=? ) 
where
    rownum <= ?
DEBUG 2012-03-21 11:37:19,332 142195  (http-8181-3:org.springframework.orm.hibernate3.HibernateTemplate):
      [org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:389)] 
      Eagerly flushing Hibernate session

DEBUG 2012-03-21 11:37:19,384 142247  (http-8181-3:org.hibernate.SQL):
      [org.hibernate.jdbc.util.SQLStatementLogger.logStatement(SQLStatementLogger.java:111)] 
update
    SEARCH_RESULT 
set
    ADDR_LINE1=?,
    ASSGND_REGION=?,
    BASE_DEAL_ID=?,
    ST_NM=? 
where
    SEARCH_ID=?

1 Ответ

2 голосов
/ 21 марта 2012

Возможно, происходит обновление, потому что Hibernate настроен на автоматическую очистку перед выполнением запросов, поэтому, если контекст постоянства считает, что у него грязные данные, он попытается обновить его.Не видя код, я не могу быть уверен, но я предполагаю, что, хотя search_result является представлением, ваш соответствующий Java-объект аннотирован на получателях, и у объекта есть соответствующие установщики.Hibernate не делает различий между таблицами и представлениями, и, если вы вызовете установщик, Hibernate предположит, что в него вносятся изменения данных для обновления.

Можно настроить способы создания объектов Java для представлений, добавив@Imutable аннотация (или hibernate. @ Entity (mutable = false) в зависимости от используемой версии. Этого должно быть достаточно, чтобы указать Hibernate, чтобы не сбрасывать изменения. Вы также можете аннотировать поля напрямую и избавиться от ваших установщиков, чтобычто потребители объекта SearchResult знают, что он доступен только для чтения.

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