Jon has a nice back-and-forth about persistence, ending with Prevayler getting some props. (Joe responds to this as well.) I’d love to use something like this, but every application I’ve developed needs to be accessible from multiple development platforms – main application, reporting, data mining, legacy interface, etc. With web services becoming more ubiquitous (and faster!) this could become moot, but AFAICT we’re not there yet.
I've said this before but I think the scheme of imposing serialization on objects (top-down) rather than having the objects serialize themselves (bottom-up) is the way to go. Everyone uses the same objects (no value/transfer object) and it's easier to swap out serialization implementations. It also offers much more flexibility -- for instance, you can have a client-side persistence manager that hooks into a simple cache (particularly for stable lookups) and a server-side one that talks to a distributed transaction cache. And if you want, you can even use these POJOs with an in-memory scheme for testing, or even in production with Prevayler or one of its buddies.