I\'m developping a mono user desktop application using SWING. I had a little experience with this kind of application on which i used the java.sql api and figured out that i
Since its a SE application, your may use the embedded database. I know H2 normally allow one thread visit, so if your are in the same developing environment and want to avoid the headache concurrence control of entity.
my suggestion is that encapsulate the your service call in one thread and assign this thread a entitymanager.
don't allow other threads to use entities , then define data access interface which can transfer data from entity to other objects in a proper data structure .
in one world, i think it is better to put all the entities in one entity manager domain and isolate them from other thread.
As I understand, the question boils down to whether you should open EntityManager and store its reference globally and access the same instance everywhere in the application.
I think that should be okay if your application is small to medium size. Just be cautious that database connection (hence session/entityManager) may drop due to various factors. And don't do this with transactions (ie dont open them in beginning and commit in end). Keep transactions as fine grained as possible.
There have been various discussion where more experienced people discussed about it, you can follow that here : for and counter argument on this SO question - Session management using Hibernate in a Swing application
Also see this on the same topic.
Here is a sample desktop application created by a committer of hibernate. Its bit old, you can get the idea.
And finally this is great article for understanding of general JPA concepts for desktop application.
have you looked at http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html/transactions.html#transactions-basics-issues. I think it would be wise to read the documentation there before proceeding using sessions object for too much time. I guess the better approach is to use the session to do a simple unit of work (for example : the CRUD operations).
Hope it helps!!.
Greetings.
After re-thinking my design, i decided to change it as follows: