I like to use a combination of:
- DBUnit
- HSQLDB
- Unitils (specifically, the database testing and maintenance modules)
You can get pretty far with just DBUnit and HSQLDB. Unitils provides the last mile of code to manage and reset database state. It also provides a nice way of managing database schema changes and makes it easy to use specific RBDMS (Oracle, DB2, SQL Server, etc). Finally, Unitils provides some nice wrappers around DBUnit which modernizes the API and makes DBUnit much more pleasant to work with.
If you haven't checked out Unitils yet, you definitely should. Unitils is often overlooked and under-appreciated.