Each hibernate session has an implicit cache associated with it and is valid as long as the session is open. This is called first level cache. Hibernate use this cache to store all operations and entity states so that, it will execute the sql queries as late as possible (at the flush time, by default).
Similarly, at the session factory level, we can configure a cache and it is available to all the sessions that are opened using that session factory. If configured properly, it will increase the application performance. There are various cache providers supported by hibernate for this (ehcache, jboss cache..etc). If a particular entity is not in the first level (session level) cache, then hibernate will consult the second level cache, and it will reach the DB only when the entity is not available in second level cache also. You can enable this second level cache per Entity, per collection or even per query basis (query results will be cached).
Check in hibernate reference documentation or google it. You can find many examples on how to configure second level cache.
Hope this helps you.