Older versions of hibernate didn't have a contextual session and there was a hack needed to make it work with spring. The changed it after hibernate 3.0.1 and since then you can write plain hibernate dao's.... As of 2007/2008 it isn't recommended anymore to use HibernateTemplate/JpaTemplate...
You have to use transactions with hibernate because else no sql will be issued to the database. Hibernate needs to know WHEN to commit (and to flush). Without transactions that isn't possible.
Why declarative transactions are recommended because it is easier. You don't have to litter your code with
Code:
try {
// start tx
// do db stuff
// commit
} catch (someexception se) {
rollback
} finally {
clean up used db resources etc.
}
With declarative tx you only have to write the 'do db stuff' part and can forget about the rest. It is all about productivity, clean code and you don't want to manage all that stuff manually (because you are going to forget to cleanup after yourself once in a while and then it is a happy debugging path..... ). Next to that you want to manage your transactions at your service/business level (that is your unit of work that needs to be transactional), which would make managing transaction/exception handling leak into your service layer where it doesn't really belong, next to that you start to pass around connections (or sessions/entitymanagers in this case) to have multiple db calls participate in the same transaction.