Win a copy of The Little Book of Impediments (e-book only) this week in the Agile and Other Processes forum!
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

EntityManager.setFlushMode(COMMIT) Vs. Query.setFlushMode(COMMIT)

 
Sandeep Vaid
Ranch Hand
Posts: 392
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

[P-331 of EJB3 In Action Book] states:
"By default, the database flush mode is set to AUTO. This means that the Entity-Manager performs a flush operation automatically as needed.
In general, this occurs at the end of a transaction for transaction-scoped EntityManagers and when the persistence context is closed for
application-managed or extendedscope EntityManagers. In addition, if entities with pending changes are used in a query, the persistence
provider will flush changes to the database before executing the query.If the flush mode is set to COMMIT, the persistence provider will
only synchronize with the database when the transaction commits.However, you should be careful with this, as it will be your responsibility
to synchronize entity state with the database before executing a query. If you don’t do this and an EntityManager query returns stale
entities from the database, the application can wind up in an inconsistent state."

[P-353 EJB3 In Action Book] states:
"If the Query is set to FlushModeType.COMMIT, the effect of updates made to entities in the persistence context is not defined
by the specification, and the actual behavior is implementation specific".

So setting the flush mode as COMMIT on EntityManager and Query have different results..Right ??
 
James Sutherland
Ranch Hand
Posts: 553
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I would expect them to have the exact same behavior. i.e. the query will not cause a flush before execution.

If you are using EclipseLink we also provide a persistence unit property to configure this,

"eclipselink.persistence-context.flush-mode"="COMMIT"

In case you don't want the flush by default, as it can be a major performance and even functional issue.
 
Sandeep Vaid
Ranch Hand
Posts: 392
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
What i really want to ask is :

Entitymanager - If the flush mode is set to COMMIT, the persistence provider will only synchronize with the database when the transaction commits


Query - If the Query is set to FlushModeType.COMMIT, the effect of updates made to entities in the persistence context is not defined by the JPA specification...

So why this different behaviour in JPA specs ?
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic