Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ORM Pink Unicorns

1,080 views

Published on

A look at improving your ColdFusion ORM code and ORM code samples

Published in: Technology
  • Be the first to comment

  • Be the first to like this

ORM Pink Unicorns

  1. 1. ORM is Fun, Easy, Smells Great, and is Full of Beautiful Unicorns!
  2. 2. WHO AM I? • Luis Majano - Computer Engineer • Born in El Salvador ------------------> • Architecture + Software Design • CEO of Ortus Solutions • Adobe Community Professional • Creator of all things Box: ColdBox, ContentBox, WireBox....
  3. 3. AGENDA • Thought experiment • Silver Bullet • Advice from Special Guest • ColdBox ORM Services
  4. 4. Thought experiment? CF ORM was easy to use? OO way to query ORM was fast 90% of biz reqs done Extensible way to finish the remaining 10% Ich Brauche ein Weißbier! Compose my relationships
  5. 5. CONCLUSIONS • Can’t or doesn’t exist • Sounds like BS • What’s this latino up to? Is he trying to get my money PROVE IT!
  6. 6. ORM is NOT a silver bullet • Just another tool • Times you need the power of the database • Mix and match • What if you wanted array of structs, or lists or queries or arrays of data? • There is a learning curve, but it is worth the investment
  7. 7. Applied Benefits • Increase in productivity of about 40% • Rich Object Models • Deliver DB patching updates • Increased Flexibility • Great for abstracting vendor specific intricacies • OO Queries • Avg JDBC <10ms
  8. 8. Guru ORMpitka 10 keys to ORM Success!
  9. 9. #1: OO Modeling is Key • ORM relationship modeling is key • OO is required • UML is your best friend • STOP THINKING ABOUT DATA • YOU ARE NOT MODELING A DATABASE
  10. 10. #2: Engine Defaults Not Great! • Do not use the CF engine defaults: • FlushAtRequestEnd = Send to Database • Session Management = Transactions • Lazy • Cascade • Caching
  11. 11. #3: Understand Hibernate Session • Not the same as session scope • A transitionary space • entityLoad() • entityNew() ? • A caching layer • You need to control when to send to DB • You can remove entities from it and clear it • You can attach a secondary cache to it
  12. 12. #4: Transaction Demarcation • Transactions demarcate SQL boundaries • Important for ORM and SQL • No communication to DB should occur without one • Must have reactive programming, expect the worst • Transaction Theory: • Any existing ORM session is flushed and closed • A new ORM session is created • Data can be committed or rollback • ORMFlush() does not work in a transaction block • If commit, then flushed to database
  13. 13. #5: Lazy Loading is KEY • You will fail if you do not use this! • Performance will SUCK! • Always Use It! • Lazy Types: • True = Only when you call getXX (all types) • Extra = Loads proxy objects with primary keys only (o-2m,m-2-m) • Proxy = Loads proxy object with primary key only (o-2-o, m-2-o) • fetch=“join” • Uses a single SQL query, great for performance • batchsize • For performance, like pagination for objects
  14. 14. #6: Avoid bi-directional • They can be more of a headache • Cascading Deletes • Inverse • Does it make sense? • Supporting methods for bi-directional linkage • Supporting methods for un-linkages
  15. 15. #6: Avoid bi-directional
  16. 16. #6: Avoid bi-directional
  17. 17. #7: Do not store entities in scopes • Don’t do it! • No linkage to Hibernate Session • Relationships will fail if not lazy • entityMerge() • Store ID’s instead
  18. 18. #8: Use DB Indexes • #1 Performance Problem • Identify relationships • Identify HQL, SQL • Learn them • property name=“isActive” index=“idxActive”
  19. 19. #9: Cache = BOOST! • Don’t go cache crazy • Develop a strategy • Does not store CFC, stores individual property values • Use distributed caches: ehcache, couchbase • You can cache: • Entity property data : Only caches properties data values • Entity association data : Only caches primary keys • Query data : HQL, ORMExecuteQuery() • Evictions: • ORMEvictEntity(), ORMEvictCollection()
  20. 20. #10: OO Modeling is Key • ORM relationship modeling is key • OO is required • UML is your best friend • STOP THINKING ABOUT DATA • YOU ARE NOT MODELING A DATABASE
  21. 21. ORM Extensions
  22. 22. ORM Extensions Base ORM Service Virtual ORM Service Active Entity Entity Populators Validation Event Handlers
  23. 23. Base ORM Service • Service layer for any entity • OO Querying, caching, transactions • Dynamic finders, getters, counters • Object metadata & session management • Exposes more features from Hibernate • 90% Foundation
  24. 24. Virtual/Concrete ORM • Extends Base ORM Services • Roots itself to a single entity = Less Typing • You can build the 10% Services
  25. 25. • Active Record Pattern • Sweet validation integration • DI Available Active Entity
  26. 26. • Populate Entities: xml, json, queries, structs • Compose relationships from simple values • Null support • Exclude/include fields • Server side validation • Dependency Injection Listeners • Custom Event Driven Programming Entity Populators Validation Event Handlers ORM Utilities
  27. 27. ORM Services in Action More awesome than a dinosaur riding a shark with a laser! box install cartracker-demo
  28. 28. Base ORM Service • count(), countWhere() • delete(), deleteAll(), deleteByID(), deleteByQuery(), delete Where() • evict(), evictEntity(), evictQueries() • executeQuery(), list() • exists() • findAll(), findAllWhere(), findByExample(), findIt(), findWhere() • get(), getAll(), • getKey(), getPropertyNames(), getSessionStatistics(), getTableName() • clear(), merge(), new(), refresh() • populate(), populateFromJSON(), populateFromXML(), populateFromQuery() • save(), saveAll()
  29. 29. Base ORM Service Dynamic Finders/Counters • Expressive Programming • Three types of dynamic Finders/Counters • findBy : find ONE entity • findAllBy : find ALL entities • countBy: Give you a count
  30. 30. Base ORM Service Dynamic Finders/Counters • Method Expressions • Conditionals • LessThanEquals, LessThan • GreaterThanEquals, GreaterThan • Like • Equal, NotEqual • isNull, isNotNull • Between, NotBetween • inList, notInList • Operators • And • Or • Query Options • ignoreCase, timeout, max, offset • cacheable, cachename
  31. 31. Criteria Builder Awesome OO Queries
  32. 32. Criteria Builder • Limitations of CF ORM: • entityLoad() has limited features • Some operations we always need an entity = slow • What if I want arrays, or arrays of structs • Complex relationships are hard to query • SQL/HQL string build is so 90’s == NOT FUN!
  33. 33. Criteria Builder • Programmatic DSL Builder • Rich set of criterias • Projections and Result transformations • Subqueries • Caching • SQL Inspections & Debugging
  34. 34. Criteria Builder
  35. 35. Criteria Builder • Request new criteria • newCriteria() • Add simple restriction(s) • Find all cars sold between April and July • Use between() • Get results • Use list( max, offset, timeout, sortOrder, ignoreCase, asQuery ) • Get counts • Use count()
  36. 36. Criteria Builder Restrictions • between() • eq() • gt() • ge() • gtProperty() • isEmpty() • isNull() • ne() • ilike() • and() • or() • not() • conjunction() • disjunction() • isTrue() • isFalse() • sqlRestriction() • ...much more!
  37. 37. Criteria Builder Retrievals • Retrieval • firstResult() • get() • list() • count() • Options • fetchSize() • readOnly() • maxResults() • cache(), cacheRegion() • timeout() • order()
  38. 38. Criteria Builder Aliases -> Joins • Allows you to do queries within relationships • Creates SQL Joins • Aliases can be nested, so if your entity knows about it, you can query it!
  39. 39. Criteria Builder Projections • Projects change nature of results • Arrays of data, or arrays of structs (Mighty Fast) • Once its added its there forever • avg • count • countDistinct • distinct • groupProperty • max • min • property • sum • rowCount • id • sqlProjection • sqlGroupProjection • detachedSQLProjection
  40. 40. Criteria Builder Debugging + Logging • Application.cfc • ormsettings.logsql = Never in production • Criteria Builder SQL Inspector • startSQLLog( returnExecutableSQL, formatSQL ) • stopSQLLog() • getSQLLog() • getSQL( returnExecutableSQL, formatSQL )
  41. 41. Q & A Thanks!

×