13
votes

As my title described, I am using hibernate Auto flush mode mechanism in my application. So, when I change any data in a hibernate persistent object, it reflects automatically in the database. I don't want this. So I found a solution to use FlushMode Commit instead.

So here is my actual question:

  • Is it better to use Commit flush mode instead of Auto? and
  • What is the meaning of this statement from the documentation?

    The Session is sometimes flushed before query execution in order to ensure that queries never return stale state.

http://docs.jboss.org/hibernate/orm/3.5/javadoc/org/hibernate/FlushMode.html

2
Check the link cpe.ku.ac.th/~plw/oop/e_book/hibernate_in_action.pdf and scroll to page 5.1.3 Flushing the Session. Cheers., - sathish_at_madison
What you are looking for is transactions. You should (in general) be using transactions to define when things are committed to the database as opposed to manually flushing the session: community.jboss.org/wiki/SessionsAndTransactions?_sscc=t - John Farrelly

2 Answers

10
votes

Hibernate (and JPA) are designed to automatically detect and persist changes to persistent objects to the database. There is no "save" operation.

If you don't want things saved, you should use detached objects. Either use a StatelessSession to load them, or call detach after loading your objects. This removes them from the monitoring that will automatically save them.

Don't mess with the flush settings, it will just give you headaches later.

7
votes

is it better to use Commit flush mode instead of Auto

When your application uses queries the FlushMode.COMMIT will most likely perform better because it will not flush session before each query. I know that per javadoc it should flush session only when necessary but from my experience FlushMode.COMMIT performs even better in read-only sessions. Auto-flush doesn't mean that any change to the persistent object is immediately posted to the database.

what is meaning of below statement specified in document

The Session is sometimes flushed before query execution in order to ensure that queries never return stale state.

As I've written above when FlushMode.AUTO (default) is used it will flush session before every query (HQL, Criteria, SQL query) made to the database to make sure results will contain all entities added within current session.