First, are you sure an entity will be accessed by several threads? Just because you use Swing doesn't mean it is (there is only one event dispatcher thread ...). But if it is, you'll have to synchronize access to hibernate and hibernate-loaded entities.
In Hibernate, sessions are isolated, i.e. an entity belongs to at most one session. This corresponds to transactional isolation, which is often desired when having independent work threads.
Therefore, I see 3 options:
1) Use one session.
2) Use one session at a time, and introduce all loaded entities to the new session by reattaching them.
3) Use sessions however you like, and do the identity fixing yourself.
As you said, a session also keeps all entities it contains alive (it must, in order to detect changes that must be written to the database).
With 2) you have to keep track of loaded entities. A interceptor around your hibernate sessions can do that, for instance with a weak hash map.
3) Is somewhat ugly, but I happen to have written code for that once. You're in luck, it's even open source:
paper:
http://el4j.sourceforge.net/docs/pdf/Id ... cement.pdf
impl:
http://el4j.svn.sourceforge.net/viewvc/ ... Fixer.java
http://el4j.svn.sourceforge.net/viewvc/ ... Fixer.java