Few of the important key points to remember in Hibernate:
1.) Use Transactional boundaries in your service layer.
2.) Outside a transaction boundary if session gets closed, the proxy object gets detached and hence if there is a collection which is lazily loaded, it can not be fetched. Either make separate call for the collection or use OpenSessionViewFilter.
3.)Use session.load() when you want to return proxy and need to property of object, just need reference with Id to be added/removed. No DB call is made.
4.)Use session.get() when you want to make a DB call and access actual object. You do it when you want to access/modify any property of the returned object.
5.) If you modify an object in persistent state it will automatically sync with DB when you commit the transaction (flush the session), it is called automatic Dirty checking.
6.) There are 4 states in hibernate :
a.) Transient -> When object is created.
b.) Persistent-> When save/update/persist is called ,
c.)Detached-> after session is closed.
d.) Removed-> after calling delete/remove.
7.) We can use either programmatic or declarative Transactions, declarative are preferred as it gives pluggability.