Have you looked in the "Transactional and system architecture design patterns" section of
http://www.hibernate.org/36.html? There's lots there to help you.
There is one point I'd like to make about this statement:
Quote:
Our data layer will also be used by a web app so we want this functionality to be added on a layer above our data layer (and thus ignored by our web app).
I think that's probably the wrong way around. If you decide to go for one of the simpler solutions, rather than say Open Session In View, then you probably should make use of lazy loading as the "normal" data access layer, and use that directly from your swing app. For your webapp, add an extra session layer above the data access layer. That session layer would know enough about the web request to inflate (initialize) all potentially-needed nodes in your hibernate object graph, and leave the rest uninflated. If the session layer has enough info, then you'll almost-eagerly fetch only what you need.