orm pink unicorns

Post on 30-Jun-2015

572 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

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