The other things that I can think of:
- You don't need to write tons of JDBC based boiler plate code.
- It's easy to model inheritance hierarchies in Hibernate. Therefore, you can have code with a more OO flavour to it. I have no experience in trying this in JDBC. But we used to have a persistence strategy that was based on JDBC and it basically had a flat structure (next to no use of inheritance). This then promotes procedural code....
3. No need for query tuning as hibernate has criteria queries
This is not true. Hibernate doesn't generate well tuned SQL. That can only be done manually, since so much of what makes SQL performant or otherwise is based on the data and its use as well as the model. Database applications need performance tuning, regardless of the data access technology used.