Fowler’s PoEAA provided a lot of guidance to drive joist via its patterns.
Specifically, with the links to their implementation in joist:
Registry–coordinates app start/shutdown and resource management
Unit of Work–coordinates dirty object tracking and validation
Identity Map–ensures entities are represented by only 1 instance-per-UoW
Data Mapper (with Meta-data Mapping)–loads data out of ResultSets and into PreparedStatements using meta-data in Alias classes generated at build-time
Foreign Key Mapping (with automatically-maintained back pointer)–loads lists of objects on demand (e.g. parent.getChildren())
Lazy Load (with value holder, e.g. no virtual proxies)–loads objects on demand (e.g. child.getParent())
Class Table Inheritance–allows modeling inheritance (no Single Table Inheritance or Concrete Table Inheritance)
Optimistic Offline Lock–every object has a version column to ensure that stale data does not overwrite fresher data
Finders (though called queries as they can also do bulk updates/deletes)
Transformer Generation (input model of database schema is transformed into a Java model)
Generation Gap (generated code is kept separate from user-modified subclasses)