orm pink unicorns

41

Click here to load reader

Upload: ortus-solutions-corp

Post on 30-Jun-2015

572 views

Category:

Technology


1 download

DESCRIPTION

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

TRANSCRIPT

Page 1: ORM Pink Unicorns

ORM is Fun, Easy, Smells Great, and is Full of Beautiful Unicorns!

Page 2: ORM Pink 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....

Page 3: ORM Pink Unicorns

AGENDA

• Thought experiment • Silver Bullet • Advice from Special Guest • ColdBox ORM Services

Page 4: ORM Pink Unicorns

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

Page 5: ORM Pink Unicorns

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!

Page 6: ORM Pink Unicorns

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

Page 7: ORM Pink Unicorns

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

Page 8: ORM Pink Unicorns

Guru ORMpitka

10 keys to ORM Success!

Page 9: ORM Pink Unicorns

#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

Page 10: ORM Pink Unicorns

#2: Engine Defaults Not Great!

• Do not use the CF engine defaults: • FlushAtRequestEnd = Send to Database • Session Management = Transactions • Lazy • Cascade • Caching

Page 11: ORM Pink Unicorns

#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

Page 12: ORM Pink Unicorns

#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

Page 13: ORM Pink Unicorns

#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

Page 14: ORM Pink Unicorns

#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

Page 15: ORM Pink Unicorns

#6: Avoid bi-directional

Page 16: ORM Pink Unicorns

#6: Avoid bi-directional

Page 17: ORM Pink Unicorns

#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

Page 18: ORM Pink Unicorns

#8: Use DB Indexes

• #1 Performance Problem • Identify relationships • Identify HQL, SQL • Learn them • property name=“isActive” index=“idxActive”

Page 19: ORM Pink Unicorns

#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()

Page 20: ORM Pink Unicorns

#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

Page 21: ORM Pink Unicorns

ORM Extensions

Page 22: ORM Pink Unicorns

ORM Extensions

Base ORM Service

Virtual ORM Service

Active Entity

Entity Populators

Validation

Event Handlers

Page 23: ORM Pink Unicorns

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

Page 24: ORM Pink Unicorns

• Extends Base ORM Services • Roots itself to a single entity =

Less Typing • You can build the 10%

Virtual/Concrete ORM Services

Page 25: ORM Pink Unicorns

• Active Record Pattern • Sweet validation integration • DI Available

Active Entity

Page 26: ORM Pink Unicorns

• 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

Page 27: ORM Pink Unicorns

ORM Services in Action

More awesome than a dinosaur riding a shark with a laser!

box install cartracker-demo

Page 28: ORM Pink Unicorns

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()

Page 29: ORM Pink Unicorns

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

Page 30: ORM Pink Unicorns

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

Page 31: ORM Pink Unicorns

Criteria Builder

Awesome OO Queries

Page 32: ORM Pink Unicorns

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!

Page 33: ORM Pink Unicorns

Criteria Builder

• Programmatic DSL Builder • Rich set of criterias • Projections and Result transformations • Subqueries • Caching • SQL Inspections & Debugging

Page 34: ORM Pink Unicorns

Criteria Builder

Page 35: ORM Pink Unicorns

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()

Page 36: ORM Pink Unicorns

Criteria Builder Restrictions

• between() • eq() • gt() • ge() • gtProperty() • isEmpty() • isNull() • ne() • ilike()

• and() • or() • not() • conjunction() • disjunction() • isTrue() • isFalse() • sqlRestriction() • ...much more!

Page 37: ORM Pink Unicorns

Criteria Builder Retrievals

• Retrieval

• firstResult() • get() • list() • count()

• Options

• fetchSize() • readOnly() • maxResults() • cache(), cacheRegion() • timeout() • order()

Page 38: ORM Pink Unicorns

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!

Page 39: ORM Pink Unicorns

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

Page 40: ORM Pink Unicorns

Criteria Builder Debugging + Logging

• Application.cfc • ormsettings.logsql = Never in production

• Criteria Builder SQL Inspector • startSQLLog( returnExecutableSQL, formatSQL ) • stopSQLLog() • getSQLLog() • getSQL( returnExecutableSQL, formatSQL )

Page 41: ORM Pink Unicorns

Thanks!

Q & A