Download - Advanced Domain Models in Grails
![Page 1: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/1.jpg)
Enterprise IntegrationMade Easy
Published under the Creative Commons Attribution Noncommercial Share Alike License Version 2.5. (Please see http://creativecommons.org/licenses/by-nc-sa/2.5 for complete details.)
Advanced Domain Models
with GrailsJason Rudolph
![Page 2: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/2.jpg)
Introduction
Jason Rudolph
Grails Committer
Principal @ Relevance
Author
![Page 3: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/3.jpg)
AgendaThe case for GORM
Conventional thinking, unconventional productivity
Relationships, any way you like ‘em
Constraints, declare and be done
GORM for non-conformists
Hibernate mappings
EJB3 annotations
Going further with GORM
![Page 4: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/4.jpg)
DAOs Considered Harmful
Grails Object-Relational Mapping (GORM)
Zero-configuration persistence management
Rich relationship model
Declarative validation
Powerful query support
Easy scaffolding
![Page 5: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/5.jpg)
Rock-Solid Foundation
![Page 6: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/6.jpg)
DAODemo
![Page 7: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/7.jpg)
Dynamic Persistence Methods
save
delete
get
addTo...
removeFrom...
withTransaction
list
findAll
findBy...
count
exists
etc.
![Page 8: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/8.jpg)
Learning to RelateOne-to-One
![Page 9: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/9.jpg)
1:1 Relationships
class Knight { String name int numDragonsSlain Sword sword }
class Sword { String serialNumber String manufacturer
}
![Page 10: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/10.jpg)
1:1 Relationships
class Knight { String name int numDragonsSlain Sword sword }
class Sword { String serialNumber String manufacturer Knight knight
}
![Page 11: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/11.jpg)
1:1 Relationships
class Knight { String name int numDragonsSlain Sword sword }
class Sword { String serialNumber String manufacturer Knight knight static belongsTo = Knight}
![Page 12: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/12.jpg)
Expanding Our Horizons
One-to-Many
![Page 13: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/13.jpg)
1:n Relationships
class Knight { //... static hasMany = [swords:Sword]}
class Sword { //... Knight knight
static belongsTo = Knight}
![Page 14: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/14.jpg)
Wisdom of CrowdsMany-to-Many
![Page 15: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/15.jpg)
class Knight { //... static hasMany = [battles:Battle]
}
class Knight { //... static hasMany = [battles:Battle] static belongsTo = Battle}
m:n Relationships
class Battle { //... static hasMany = [knights:Knight]}
![Page 16: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/16.jpg)
Learning to RelateDemo
![Page 17: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/17.jpg)
Conventional Thinking
Demo
![Page 18: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/18.jpg)
More GORM Fu
Customizable fetch modes
static fetchMode ww= [someOtherAttribute : ‘eager’]
Composition
static embedded = [‘someAttribute’]
Table-per-hierarchy inheritance
![Page 19: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/19.jpg)
Declaring Constraints
Pre-packaged constraints
Custom constraints
Influence schemas and scaffolding
blank
creditcard
inList
min
max
matches
nullable
range
unique
url
etc.
![Page 20: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/20.jpg)
The Power of Constraint
Demo
![Page 21: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/21.jpg)
Defying Conventional Wisdom
Non-conforming table/column names
Custom sequences
Complex keys
Advanced mappings
![Page 22: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/22.jpg)
No Schema Left Behind
Demo
![Page 23: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/23.jpg)
Hibernate XML - Step-by-Step
Define Hibernate artifacts
Add hibernate.cfg.xml
Prepare HBM file for each deviant table
Consider reverse engineering with Hibernate tools
Create Grails domain classes
Add constraints (optional)
![Page 24: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/24.jpg)
Why Hibernate XML?
Standard Hibernate artifacts
Reuse your existing mappings
Full power of GORM
Dynamic persistence methods
Constraints
Scaffolding
![Page 25: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/25.jpg)
Pimp My EJBsDemo
![Page 26: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/26.jpg)
EJB3 Step-by-Step
Start with Java 5 (or higher)
Update DataSource.groovy
configClass = wwGrailsAnnotationConfiguration.class
Add POJOs to src/java
Define hibernate.cfg.xml
Drop in constraints (optional)
![Page 27: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/27.jpg)
Why Annotate?
Standards-based POJOs
Reuse elsewhere
Not tied to Grails
Full power of GORM (once again)
Dynamic persistence methods
Constraints
Scaffolding
![Page 28: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/28.jpg)
A Groovier SolutionDemo
![Page 29: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/29.jpg)
Going Further with GORM
GORM outside of Grails
grails.org/gorm+-+standalone+gorm
Java on GORM
jroller.com/page/ie?entry=java_on_grails
![Page 30: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/30.jpg)
Still More to ExploreCustom user types
grails.org/hibernate+integration
ORM DSL <brand new!>
grails.org/GORM+-+Mapping+DSL
Migrations <brand new!>
code.google.com/p/dbmigrate/wiki/Grails
![Page 31: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/31.jpg)
Resources
grails.org
Downloads
Latest release (0.6)
Development snapshot (1.0-RC1)
User guide, tutorials, screencasts, etc.
Mailing lists (grails.org/mailing+lists)
![Page 32: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/32.jpg)
Resources (cont’d)
GORM Documentation
grails.org/gorm
Grails Podcast - Episode 18
svenhaiges.de/space/start/2006-11-24/1
![Page 33: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/33.jpg)
Resources (cont’d)
Grails + EJB3 Tutorial
infoq.com/articles/grails-ejb-tutorial
Hibernate Tools
hibernate.org/255.html
![Page 34: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/34.jpg)
![Page 35: Advanced Domain Models in Grails](https://reader034.vdocuments.us/reader034/viewer/2022042613/544f49a8b1af9f156f8b578b/html5/thumbnails/35.jpg)
Slides & Examples Available
@
www.jasonrudolph.com/downloads
Please Fill Out Your Evaluations
This presentation is published under the Creative Commons Attribution Noncommercial Share Alike License Version 2.5.
(Please see http://creativecommons.org/licenses/by-nc-sa/2.5 for complete details.)