OpenJPA Architecture notes:
Design point: object persistence; ORM but other stores also supported by
the architecture
domain model: user's responsibility; other areas are OpenJPA
persistence kernel is central part
delegates to other stores via data cache store
front ends, kernel, back ends
query parse tree is general purpose, with several query generators
openjpa.kernel:
dirty tracking, state management, lazy loading
only keeps track of the fact that a field has changed, not the previous value unless retainValues flag is set
supports managed relationships (rectifying domain model at commit or flush)
two types of managed relationships (inverse vs. dependent)
query parser written in JJTree (extension of javacc but generates AST Nodes)
openjpa.datacache:
query cache might not be optimal depending on the query: if there is a rich fetch plan but data is already cached from a previous query
openjpa.enhance:
now optional but performance costs
enhancer allows lazy loading of all fields; and dirty tracking
lifecycle management, instance factory should be separated from dirty tracking and field management
openjpa.meta:
used at enhancement time, runtime, schema generation
distinguishes between persistence metadata and mapping metadata
openjpa.persistence:
binding to JPA specification
openjpa.lib.jdbc:
wrappers to work around driver-specific bugs
BrokerFactory:
abstract class extended by store-specific factory
Broker:
Hibernate Session, JDO PersistenceManager analog
OpenJPAStateManager:
internal transient object identity is used for newly-persistent instances
OpenJPA also supports JDO datastore identity
if user asks for the id, the instance is flushed to get the id if needed (unless not using agent)
StoreManager:
tight relationship with Broker, e.g. for relationship loading
the link between Broker and StoreManager has a cache decorator to involve the data cache and query cache