orm pink unicorns
Post on 30-Jun-2015
572 Views
Preview:
DESCRIPTION
TRANSCRIPT
ORM is Fun, Easy, Smells Great, and is Full of Beautiful Unicorns!
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....
AGENDA
• Thought experiment • Silver Bullet • Advice from Special Guest • ColdBox ORM Services
Thought experiment?
CF ORM was easy to use?
OO way to query
ORM was fast90% of biz reqs done
Extensible way to finish the remaining
10%
Ich Brauche ein Weißbier!
Compose my relationships
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!
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
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
Guru ORMpitka
10 keys to ORM Success!
#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
#2: Engine Defaults Not Great!
• Do not use the CF engine defaults: • FlushAtRequestEnd = Send to Database • Session Management = Transactions • Lazy • Cascade • Caching
#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
#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
#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
#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
#6: Avoid bi-directional
#6: Avoid bi-directional
#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
#8: Use DB Indexes
• #1 Performance Problem • Identify relationships • Identify HQL, SQL • Learn them • property name=“isActive” index=“idxActive”
#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()
#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
ORM Extensions
ORM Extensions
Base ORM Service
Virtual ORM Service
Active Entity
Entity Populators
Validation
Event Handlers
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
• Extends Base ORM Services • Roots itself to a single entity =
Less Typing • You can build the 10%
Virtual/Concrete ORM Services
• Active Record Pattern • Sweet validation integration • DI Available
Active Entity
• 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
ORM Services in Action
More awesome than a dinosaur riding a shark with a laser!
box install cartracker-demo
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()
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
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
Criteria Builder
Awesome OO Queries
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!
Criteria Builder
• Programmatic DSL Builder • Rich set of criterias • Projections and Result transformations • Subqueries • Caching • SQL Inspections & Debugging
Criteria Builder
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()
Criteria Builder Restrictions
• between() • eq() • gt() • ge() • gtProperty() • isEmpty() • isNull() • ne() • ilike()
• and() • or() • not() • conjunction() • disjunction() • isTrue() • isFalse() • sqlRestriction() • ...much more!
Criteria Builder Retrievals
• Retrieval
• firstResult() • get() • list() • count()
• Options
• fetchSize() • readOnly() • maxResults() • cache(), cacheRegion() • timeout() • order()
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!
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
Criteria Builder Debugging + Logging
• Application.cfc • ormsettings.logsql = Never in production
• Criteria Builder SQL Inspector • startSQLLog( returnExecutableSQL, formatSQL ) • stopSQLLog() • getSQLLog() • getSQL( returnExecutableSQL, formatSQL )
Thanks!
Q & A
top related