I did some research on expresso a year and half back, at that time, CMP is not mature, JDO are barely heard, but I still think I should first evaluate/integrate available persistent frameworks before commit too much effort on building my own.
Expresso framework has many nice features, but I feel its database object make business logic too tight with its SQL logic. This makes it very inflexible to change on either side and leads to bulky code, especially if you want lots code generation but still maitain business logic kind of independent from schema.
Today we have many choices, if I was dealing with a small set objects but requires sophisticated O/R mapping, then I will pick CMP from app servers.Or JDO products, as they generally don't put persistent logic into your business object at source level, they handle Persistence thru inception or binary manupilaton. If your app need consider portable across database, a pluggable persistent layer is very important.
My topas has a more strainght forward PM layer compare to CMP, it's best for large number of objects but most of them are direct mapping from business object to table, of course, virtual attributes or object joint is supported out of box as well. the key point is, like CMP or JDO, topas PM is done in a delegation fashion. BO contains no knowledge about persistence, it is handled by adaptors, that can be a sql adpator to generate sql, or JMS, or XML adpator to other type resources. So topas + CMP would be my choice, and for others,in IMHO, JDO+CMP should be the way to go.