Validating domain objects hibernate part 5
We have 4 packages responsible for given layers of our application.
So we have a controller package with Issue Controller, where we handle all http requests.
But for this to work, you have to know all the ids for your objects so that the ids will look correct to Hibernate. First is that you don't actually need transaction 2 since the session is open you could just load the backing objects from the db, thus avoiding the dirty check on the session.
The other option is to evict foo from the session after it is retrieved and later use session.merge() to reattach it when you what your changes to be stored.
go back to edit screen transaction 2 (read only) load form backing objects from db transaction 2 end go to view else transaction 3 session.update(foo) transaction 3 end the problem we have is if the validation fails foo is marked "dirty" in the hibernate session (since we use Open Session In View we only have one session throughout the http request), when we load the form backing objects (like a list of some entities using an HQL query), hibernate before performing the query checks if there are dirty objects in the session, it sees that foo is and flushes it, when transaction 2 is committed the updates are written to the database.
The problem is that even though it is a read only transaction and even though foo wasn't updated in transaction 2 hibernate doesn't have knowledge of which object was updated in which transaction and doesn't flush only objects from that transaction. did somebody ran into similar problem before Update: this post sheds some more light on the problem: You can run a get on foo to put it into the hibernate session, and then replace it with the object you created elsewhere.
This is way you don't actually need to call session.update() for any object that is already in the session. Do you think an ORM is a transparent abstraction of your datastore, or do you think it's a set of data manipulation libraries? Its whole reason for existing is to remove the distinction between your in-memory object state and your database state.
That might put your operations into separate sessions so you don't have to deal with the 1st level cache issues.Otherwise you will probably want to detach/attach your objects manually as the user above suggests.You could also change the Flush Mode on your Session if you don't want things being flushed automatically (Flush Mode. Implement a service layer, take a look at spring's @Transactional annotation, and mark your methods as @Transactional(read Only=true) where applicable.Your flush mode is probably set to auto, which means you don't really have control of when a DB commit happens.You could also set your flush mode to manual, and your services/repos will only try to synchronize the db with your app when you tell them to.