Well, there may be a hundred different answers to your question, depending on how the DAO is implemented.
Here's a quick take.
A DAO simplified accessing data from a database. As such, it needs to interact with the database, which means it needs a TRANSACTION. So, a DAO needs a transaction in order to do its work.
Opening a Hibernate Session can be thought of as connecting to your database, and before you do anything with that connection, you need to ask the Hibernate Session to start a transaction. So, to connect to the database and start a transaction, you need the Hibernate Session. Starting to see how the DAO and the Hibernate Session might work hand in hand?
Now, if your DAO gets a list from the database, when should the transaction be started, and the connection to the database opened? Before the list method on the DAO is invoked, or after, aka, inside the list method?
Well, in the world of client demarcation, you'd do it before the list method is called. For various reasons, sometimes it must be done in other places, maybe even inside the DAO (although that tends to fall into the one-transaction-per-method anti-pattern.)
So, that's a quick answer. We can get much more complicated, and take the discussion in many different directions, but I think that's a pretty quick intro.
For some more information on Hibernate and some tutorials, check out some of the examples on my website:
http://jpa.ezhibernate.com/Javacode/learn.jsp?tutorial=23whatishibernate