Hibernate / Spring HibernateTemplate.findByCriteria (Datched Criteria dc) does sql update on view
I am trying to search for a given criteria. This view has several fields for several different objects in my application that the user might want to find.
When I enter the name of the object that I want to find, before calling,
I add the constraint for the name field to the sandboxed criterion. This results in
getting a list of results with the name I am looking for.
Also, when I look at my log, I see that hibernate is calling
Now I have added another object to my view with multiple search fields. When I try to find the field associated with this new entity, I get an exception in my log.
When I go through my log with the exception, I see that hibernate is calling a
statment with the statement
(I am not trying to update the entry, just load it into the list).
So why is hibernate calling an update when I call
on my new object?
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 that gets executed:
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=?
source to share
There may have been an update because Hibernate is configured to autostart before executing queries, so if the persistence context thinks it has dirty data, it will try to update it. Without seeing the code, I can't be sure, but I would assume that even if search_result is a view, your corresponding Java object is annotated with getters and the object has comparable setters. Hibernate makes no distinction between tables and views, and if you call a setter, Hibernate will assume it has data changes to update.
You can customize how you create your Java objects for views by adding the @Immutable annotation (or hibernate. @Entity (mutable = false) depending on the version you are using. This should be enough to tell Hibernate not to flash the change. You you can also annotate the fields directly and get rid of your setters so that users of the SearchResult object know they are read-only.
source to share