Your first implementation is not thread-safe, so I think
you should go with the second. Or I often saw the following:
I think it is a little bit more efficient since you lock only at the first call.
About cathching or propagating the HibernateException I can't say anything, since I don't know too much about Hibernate.