apache cayenne for wo devs
TRANSCRIPT
![Page 1: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/1.jpg)
Apache Cayenne for WO Devsby Andrus Adamchik, ObjectStyle LLC
![Page 2: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/2.jpg)
• 2001 - inception
• 2002 - first “alpha” release and a large production deployment
• 2006 - Cayenne becomes “Apache Cayenne”
• still active and evolving...
History
![Page 3: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/3.jpg)
• A top-level project at Apache Software Foundation
• 17 committers
• 9 PMC members
• Majority of PMC have WO/EOF background
• ... not all are active ...
Project Structure and Governance
![Page 4: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/4.jpg)
Releases
• 3.0 - current stable
• 3.1 - Beta, recommended for all users
• 3.2 - in development; used for this presentation
![Page 5: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/5.jpg)
Mapping Structure
![Page 6: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/6.jpg)
Separate DB and Object Layers
![Page 7: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/7.jpg)
DB layer: DbEntities containing DbAttributes and connected with DbRlationships
• DbEntity - models a table or a view
• DbAttribute - models a column
• DbRelationship - models PK/FK relationship going in one direction
![Page 8: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/8.jpg)
Object layer: ObjEntities containing ObjAttributes and connected with ObjRlationships
• ObjEntity - models a persistent Java class
• ObjAttribute - models a “simple” property of a Java class
• ObjRelationship - models a “relationship” property, i.e. a property of type that is another ObjEntity (can be to-one or to-many). Going in one direction only.
![Page 9: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/9.jpg)
Connecting Obj to Db Layer
• ObjEntity references a single DbEntity
![Page 10: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/10.jpg)
Connecting Obj to Db Layer
• (simple attribute) ObjAttribute references a DbAttribute
• (flattened attribute) ObjAttribute references a “dbpath” across one or more DbRelationships ending with an attribute
![Page 11: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/11.jpg)
Connecting Obj to Db Layer
• (simple relationship) ObjRelationship references a DbRelationship
• (flattened relationship) ObjRelationship references a “dbpath” across 2 or more DbRelationships
![Page 12: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/12.jpg)
CayenneModeler
![Page 13: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/13.jpg)
Cross-platform natively-packaged tool to work on Cayenne mapping projects
![Page 14: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/14.jpg)
Tools > Reengineer Database Schema
![Page 15: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/15.jpg)
Tools > Generate Database Schema
![Page 16: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/16.jpg)
Tools > Migrate Schema
![Page 17: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/17.jpg)
Tools > Generate Classes
![Page 18: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/18.jpg)
Tools > Import EOModel
![Page 19: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/19.jpg)
Modeling Workflow
![Page 20: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/20.jpg)
Challenge - keeping these in sync:
![Page 21: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/21.jpg)
Maven and Ant Tools
• cgen - generates classes from the ORM model
• cdbimport - generates model from DB
• cdbgen - generates DB from the model
![Page 22: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/22.jpg)
Modeler Workflow... on project start:
![Page 23: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/23.jpg)
Modeler Workflow... on each iteration:
![Page 24: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/24.jpg)
Modeler-Free Workflow... on project start:
![Page 25: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/25.jpg)
Modeler-Free Workflow... on each iteration:
![Page 26: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/26.jpg)
Modeler-free Workflow - Maven
<plugin> <groupId>org.apache.cayenne.plugins</groupId> <artifactId>maven-cayenne-plugin</artifactId> <configuration> <map>${project.basedir}/src/main/resources/my.map.xml</map> <destDir>${project.basedir}/src/main/java</destDir> <defaultPackage>com.example.cayenne</defaultPackage> <superPkg>com.example.cayenne.auto</superPkg> <url>jdbc:mysql://127.0.0.1/mydb</url> <username>user</username> <password>secret</password> <driver>com.mysql.jdbc.Driver</driver> <excludeTables>migrations</excludeTables> </configuration> <executions> <execution> <id>default-cli</id> <goals> <goal>cdbimport</goal> <goal>cgen</goal> </goals> </execution> </executions></plugin>
![Page 27: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/27.jpg)
When to use Modeler-free workflow?
• when DB objects have sane naming
• when DB has FK constraints defined
• when no per-entity model tweaking is needed (optimistic locking, PK generation, exclusion of attributes, etc.)
![Page 28: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/28.jpg)
Writing Apps with Cayenne
![Page 29: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/29.jpg)
Starting Cayenne
// create reusable ‘runtime’ instanceServerRuntime runtime = new ServerRuntime("cayenne-myproject.xml");
![Page 30: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/30.jpg)
Stopping Cayenne
runtime.shutdown();
![Page 31: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/31.jpg)
ObjectContext
![Page 32: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/32.jpg)
Obtaining ObjectContext
// regular contextObjectContext context = runtime.newContext();
// nested contextObjectContext nestedContext = runtime.newContext(context);
![Page 33: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/33.jpg)
ObjectContext
• An isolated “session” to access Cayenne
• Has its own copy of each object
• Doesn’t require explicit shutdown (can be simply thrown away when no longer in use)
• Can be serialized
• Can be scoped differently based on app requirements
![Page 34: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/34.jpg)
Under the Hood ServerRuntime is a DI container
![Page 35: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/35.jpg)
Overriding a DI service to create custom ObjectContexts
public class MyContextFactory implements ObjectContextFactory { @Inject private EventManager eventManager;
@Override public ObjectContext createContext() { return new MyContext(eventManager); } @Override public ObjectContext createContext(DataChannel parent) { return new MyContext(parent, eventManager); }}
Module myModule = new Module() { @Override public void configure(Binder binder) { binder.bind(ObjectContextFactory.class).to(MyContextFactory.class); }};
// override built-in services via a custom moduleServerRuntime runtime = new ServerRuntime("cayenne-myproject.xml", myModule);
![Page 36: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/36.jpg)
DI Container Highlights
• Very small - 40K
• Intended to make Cayenne runtime modular and customizable
• Does not interfere with or care about application DI
• Can be used outside Cayenne, but this was not the goal
![Page 37: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/37.jpg)
Queries
![Page 38: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/38.jpg)
SelectQuery
• Most commonly used query
• Data rows option
• Fetch offset/limit
• Prefetching (separate strategies)
• Result caching, pagination
• Iterated result
![Page 39: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/39.jpg)
SelectQuery
ObjectContext context = ...
SelectQuery<Artist> query = new SelectQuery<Artist>(Artist.class);List<Artist> allArtists = context.select(query);
![Page 40: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/40.jpg)
SelectQuery with qualifier
ObjectContext context = ...
SelectQuery<Artist> query = new SelectQuery<Artist>(Artist.class);query.andQualifier(Artist.NAME.like("A%"));query.andQualifier(Artist.DATE_OF_BIRTH.lt(new Date()));
List<Artist> someArtists = context.select(query);
INFO: SELECT t0.NAME, t0.DATE_OF_BIRTH, t0.ID FROM ARTIST t0 WHERE (t0.NAME LIKE ?) AND (t0.DATE_OF_BIRTH < ?) [bind: 1->NAME:'A%', 2->DATE_OF_BIRTH:'2013-05-09 20:51:12.759']INFO: === returned 1 row. - took 2 ms.
![Page 41: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/41.jpg)
Other Queries
• EJBQLQuery
• SQLTemplate
• ProcedureQuery
• ObjectIdQuery, RelationshipQuery, QueryChain
• Custom queries...
![Page 42: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/42.jpg)
Caching Query Results
![Page 43: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/43.jpg)
Can be used with any Query and is fairly transparent
SelectQuery<Artist> query = new SelectQuery<Artist>(Artist.class);query.andQualifier(Artist.ARTIST_NAME.like("A%"));
// This is all it takes to cache the result. // There’s no need to calculate a cache key. // Cayenne will do that for youquery.useLocalCache();
List<Artist> someArtists = context.select(query);
![Page 44: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/44.jpg)
Lifecycle Events
• PostAdd, PrePersist, PreUpdate, PreRemove, PostPersist, PostUpdate, PostRemove, PostLoad
• Persistent objects can declare callback methods to be notified about own events
• Any non-persistent object can be a listener for various entity events.
![Page 45: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/45.jpg)
Lifecycle Events
• Higher-level “workflows” are implemented by matching entities with listeners using custom annotations and providing operation context via DataChannelFilter
![Page 46: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/46.jpg)
Remote Object Persistence (ROP)
![Page 47: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/47.jpg)
ROP Highlights
• Same as nested ObjectContext, only child context lives in a remote JVM
• Full ORM API and behavior available on the client:
• Queries, lazy relationships, caching, pagination, etc.
• Client objects based on the same model as server
• Client objects are using a different superclass
![Page 48: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/48.jpg)
Other ORM Choices
• Hibernate
• JPA
![Page 49: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/49.jpg)
Cayenne Difference - Object Design
Others enhanced/proxied POJO ORM Annotations
Cayenne framework superclass annotations used for other things
Advantage
faster startup times “WYSIWYG” objects generic persistent objects less code clutter
![Page 50: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/50.jpg)
Cayenne Difference - Runtime
Others explicit transactions
Cayenne on-demand implicit transactions
Advantage less code, cleaner code seamless relationship navigation
![Page 51: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/51.jpg)
EOF Analogies
“All characters and events – even those based on real people – are entirely fictional.”
![Page 52: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/52.jpg)
Persistent Objects
• EOEnterpriseObject : Persistent, DataObject, CayenneDataObject
• EOGlobalID : ObjectId
• EOGenericRecord : CayenneDataObject
![Page 53: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/53.jpg)
Mapping
• EOModel : DataMap
• EOModelGroup : EntityResolver
• EOEntity: DbEntity / ObjEntity
![Page 54: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/54.jpg)
Query
• EOFetchSpecification : SelectQuery
• EOQualifier : Expression
• EOSortOrdering : Ordering
![Page 55: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/55.jpg)
Runtime
• EOEditingContext : ObjectContext
• EOAdapter : DataNode
• JDBCPlugin : DbAdapter
![Page 56: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/56.jpg)
Cayenne != EOF
![Page 57: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/57.jpg)
What You Might Miss from EOF
• Quirky Vertical Inheritance
• No Horizontal Inheritance
• No prototypes
• No Eclipse plugin
![Page 58: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/58.jpg)
What You Get in Return• Multithreading
• IDE-independent Modeler
• Internal dependency injection
• Query abstraction beyond SelectQuery
• EJBQL and aggregated queries
• Iterated query
• Transparent Query result cache
• Transparent Query result pagination
• Auto-increment PK
• Automated DB type detection
• Prefetch strategies
• Lifecycle events
![Page 59: Apache Cayenne for WO Devs](https://reader034.vdocuments.site/reader034/viewer/2022052206/555a69c7d8b42ae7218b4d70/html5/thumbnails/59.jpg)
A chance to influence things!