In most cases, you'd pick either JDBC or one of the ORM technologies (
EJB, JDO, Hibernate) to manage persistent data. JDBC has the advantage of being something you can hack out in a hurry. ORM has the advantage of allowing you to talk to the database in
Java form. It's more trouble to set up, but scales up better.
JDBC, interestingly enough, benchmarks slower than most current ORM platforms.
A DAO layer allows you the flexibility to swap in and out for the persistence mechanism that works best - including a mock layer for
testing purposes. The downside is some added complexity.
Spring is a nice thing to pair with JSF for persistency purposes, BTW. It's fairly lightweight, but it makes the individual modules simpler and more reliable, and it handles a lot of the repetitive "grunt work" for you. Once again, added complexity in terms of number of program parts, but the individual parts become simpler. The tradeoff being development costs versus what the progam will cost in ongoing maintenance.