SlideShare una empresa de Scribd logo
1 de 73
Descargar para leer sin conexión
UNDERSTANDING GORM
Alonso Torres @alotor
http://goo.gl/U6sK5E
Ego-slide
Alonso Torres
alotor @alotor
Engineer atKaleidos
GORM? Really?
Is so easy, the easiestpartof Grails!
Onlyafew POGO's to access the database
Peachy!
Some pitfalls
The 'When did I modified thatobject?'
defrenderBook(Stringisbn){
defbook=Book.findByIsbn(isbn)
//Renderasuppercase
book.title=book.title.toUpperCase()
[book:book]
}
Some pitfalls
The 'Rollback where are you?'
defbuyBook(Stringuser,StringbookTitle,Longqty){
deffound=Book.findByTitle(bookTitle)
//Saveaneworderfortheuser
deforder=newBookOrder(user:user,book:found,quantity:qty)
order.save()
found.stock=found.stock-1
//Whennotfoundthrowexceptiontorollback
if(found.stock<0){
thrownewException("Thisshouldrollback!")
}
returnfound
}
Some pitfalls
The 'Parallelprocessing, It's easy!!'
defprocessOrders(){
deforders=BookOrder.list()
//Parallelupdateorders
GParsPool.withPool(10){
orders.eachParallel{order->
dispatchingService.dispatch(order)
order.sent=true
order.save()
}
}
}
Some pitfalls
The 'Failwhale'
classUser{
Stringname
statichasMany=[followers:User]
}
user.followers.isEmpty()
CheckBurttalkabout"GORMPerformance"
GORM is dark and full of
terrors
Let's take a step back...
and start at the beginning
Understanding Bootstrapping
WHAT'S GOING ON BEHIND THE SCENES?
Your first Domain class
classBook{
Stringname
Stringisbn
Authorauthor
}
Grails Bootstrap
Inspect/grails-app
Classes inside /domain
Annotates them with @grails.persistence.Entity
grailsrun-app
1) Domain classes are found
DEBUGcommons.DefaultGrailsApplication
Inspecting[es.greach.gorm.Book]
[es.greach.gorm.Book]isnotaFiltersclass.
[es.greach.gorm.Book]isnotaCodecclass.
[es.greach.gorm.Book]isnotaTagLibclass.
[es.greach.gorm.Book]isnotaServiceclass.
[es.greach.gorm.Book]isnotaControllerclass.
[es.greach.gorm.Book]isnotaBootstrapclass.
[es.greach.gorm.Book]isaDomainclass.
Addingartefactclasses.greach.gorm.BookofkindDomain
Grails initializes the Domain Class
Prepares the relationship properties
Resolves class hierarchy
Add validation capabilities
Integrates domain classes with Spring
@grails.persistence.Entity
Includes 'id'and 'version'
Marks the classes as domain entities
You can putdomain classes inside /src/main/groovy
Manualyannotate them with @Entity
@Entity
classBook{
Longid
Longversion
Stringname
Stringisbn
Authorauthor
}
2) GORM enhances classes
classBook{
staticmapWith="mongo"
Stringname
Stringisbn
}
DEBUGcfg.HibernateUtils -EnhancingGORMentityBook
GORM Enhancer
Instances API (save, delete...)
Classes API (findAll, where, withCriteria...)
Dynamic Finders
Validation (unique)
GORM Enhancer
Instances API (save, delete...)
Classes API (findAll, where, withCriteria...)
Dynamic Finders
Validation (unique)
Bootstraping
DistinctGrails-base vs GORM
@Entitycould potentialybe used outside Grails
Problems with AST's
Grails dependencies
Understanding Spring
HOW INTERACT DOMAIN CLASSES AND SPRING
classBook{
defbookService
Stringname
Stringisbn
Authorauthor
StringtoString(){
returnbookService.parseBook(this)
}
}
defmyBook=newBook()
printlnmyBook.toString()
[DEBUG]BookService::parseBook
DI needs control on object instantiation
Spring should create the object
newBook()
So Grails kind of "cheats"
Spring Beans for a Domain Class
BookValidator
BookPersistentClass
BookDomainClass
Book
newBook()
Book.constructor={->
defctx=....//Springcontext
context.getBean("Book")
}
What does that means?
Springcreates your objects
Be carefulwhen usingsome capabilities
Example: SpringAOP
Understanding Hibernate GORM
WHERE THE DARKNESS LURKS
GORM > Hibernate
GORM provides abeautifulabstraction over hibernate
Convention over configuration
No more complicated XML or annotations
Better collections
But, Hibernate it's still there
classBook{
Stringname
Stringisbn
Authorauthor
}
grailsgenerate-controllerBook
//Grails2.2scafolding
classBookController{
defsave(){
definstance=newBook(params)
if(!instance.save(flush:true)){
render(view:"create",model:[bookInstance:instance])
return
}
redirect(action:"show",id:instance.id)
}
}
//Grails2.2scafolding
classBookController{
defsave(){
defbookInstance=newBook(params)
if(!bookInstance.save(flush:true)){
render(view:"create",model:[bookInstance:bookInstance])
return
}
redirect(action:"show",id:bookInstance.id)
}
}
OpenSessionInViewInterceptor
Creates anew Sessionwithin aController scope
Doesn'tcreate aTransaction
So... there is NO transaction atthe controller
After render the session is flushed
Session? Transaction? I'm confused
Session
Entrypointto the Hibernate Framework
In-Memorycache
No thread safe and normalythread-bound
GORM Entities
Entities have arelationship with the session
This defines a"life-cycle"
Transient -notyetpersisted
Persistent -has asession
Detached -persisted butwithoutsession
Session Flush
Session checks "DIRTY OBJECTS"
When flushed the changes are persisted to database
After flush, are my objects in the DB?
DEPENDS
Transaction
Database managed
Provider specific
Accessed through JDBC Driver
PeterLedbrok- http://spring.io/blog/2010/06/23/gorm-gotchas-part-1/
Hibernate Session
FLUSHING
vs
COMMIT
Database Transaction
Automatic session flushing
Queryexecuted
Acontroller completes
Before transaction commit
Some pitfalls
The 'When did I modified thatobject?'
defrenderBook(Stringisbn){
defbook=Book.findByIsbn(isbn)
//Renderasuppercase
book.title=book.title.toUpperCase()
[book:book]
}
Some pitfalls
The 'When did I modified thatobject?'
defrenderBook(Stringisbn){
defbook=Book.findByIsbn(isbn)
//Deattachtheobjectfromthesession
book.discard()
//Renderasuppercase
book.title=book.title.toUpperCase()
[book:book]
}
Where do I put my transactional logic?
withTransaction
Book.withTransaction{
//Transactionalstuff
}
Transactional services
@Transactional
classBookService{
defdoTransactionalStuff(){
...
}
}
Be careful!
Don'tinstanciate the services
Don'tuse closures
And...
newTransactionalService().doTransactionalStuff()
deftransactionalMethod={...}
DON'T THROW CHECKED EXCEPTIONS
Some pitfalls
The 'Rollback where are you?'
defbuyBook(Stringuser,StringbookTitle,Longqty){
deffound=Book.findByTitle(bookTitle)
//Saveaneworderfortheuser
deforder=newBookOrder(user:user,book:found,quantity:qty)
order.save()
found.stock=found.stock-1
//Whennotfoundthrowexceptiontorollback
if(found.stock<0){
thrownewException("Thisshouldrollback!")
}
returnfound
}
Some pitfalls
The 'Rollback where are you?'
defbuyBook(Stringuser,StringbookTitle,Longqty){
deffound=Book.findByTitle(bookTitle)
//Saveaneworderfortheuser
deforder=newBookOrder(user:user,book:found,quantity:qty)
order.save()
found.stock=found.stock-1
//Whennotfoundthrowexceptiontorollback
if(found.stock<0){
thrownewRuntimeException("Thisshouldrollback!")
}
returnfound
}
@Transactional vs @Transactional
Spring@Transactionalcreates aPROXY
Grails new @Transactionalis an AST
Understanding Parallel GORM
BRACE YOURSELVES
Session is Thread-Local
Some pitfalls
The 'Concurrency, It's easy!!'
defprocessOrders(){
deforders=BookOrder.list()
//Parallelupdateorders
GParsPool.withPool(10){
orders.eachParallel{order->
dispatchingService.dispatch(order)
order.sent=true
order.save()
}
}
}
Thread-local session
Recovers alistof orders
Each item is bound to the requestsession
When we spawn the concurrentthreads the objects don't
know where is their session
deforders=Orders.findTodayOrders()
Some pitfalls
The 'Concurrency, It's easy!!'
defprocessOrders(){
deforders=BookOrder.list()
//Parallelupdateorders
GParsPool.withPool(10){
orders.eachParallel{order->
BookOrder.withNewSession{
order.merge()
dispatchingService.dispatch(order)
order.sent=true
order.save()
}
}
}
}
Rule of thumb
Session = Thread
If entityhas recovered byanother thread
Putitin the currentthread session
Grails 2.3 Async GORM
The new async GORM solves some problems
Manages the session for the promise
defpromise=Person.async.findByFirstName("Homer")
defperson=promise.get()
Grails 2.3 Async GORM
Problem: Objecthas been retrieved byanother thread
After the promise is resolved we have to attach the object
defpromise=Person.async.findByFirstName("Homer")
defperson=promise.get()
person.merge()//Reboundtheobjecttothesession
person.firstName="Bart"
Closing thoughts
GORM is averycoolabstraction
You have to be aware of some of how things work
With greatpower, comes greatresponsibility
THANKS
@alotor
http://goo.gl/U6sK5E
Bonus track (references)
http://spring.io/blog/2010/06/23/gorm-gotchas-part-1/
http://sacharya.com/tag/gorm-transaction/
http://www.anyware.co.uk/2005/2012/11/12/the-false-
optimism-of-gorm-and-hibernate/
http://docs.jboss.org/hibernate/orm/3.6/reference/en-
US/html_single/#transactions-basics
Bonus track (references)
http://www.infoq.com/presentations/GORM-Performance
http://www.infoq.com/presentations/grails-transaction
http://blog.octo.com/en/transactions-in-grails/
https://community.jboss.org/wiki/OpenSessioninView

Más contenido relacionado

La actualidad más candente

OOCSS for JavaScript Pirates jQcon Boston
OOCSS for JavaScript Pirates jQcon BostonOOCSS for JavaScript Pirates jQcon Boston
OOCSS for JavaScript Pirates jQcon Boston
John Hann
 
Server Side JavaScript - You ain't seen nothing yet
Server Side JavaScript - You ain't seen nothing yetServer Side JavaScript - You ain't seen nothing yet
Server Side JavaScript - You ain't seen nothing yet
Tom Croucher
 
Unobtrusive javascript with jQuery
Unobtrusive javascript with jQueryUnobtrusive javascript with jQuery
Unobtrusive javascript with jQuery
Angel Ruiz
 

La actualidad más candente (20)

Scripting as a Second Language
Scripting as a Second LanguageScripting as a Second Language
Scripting as a Second Language
 
High Performance Social Plugins
High Performance Social PluginsHigh Performance Social Plugins
High Performance Social Plugins
 
Building a real life application in node js
Building a real life application in node jsBuilding a real life application in node js
Building a real life application in node js
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] Enterprise
 
Spock Framework (Java Day BY 2015)
Spock Framework (Java Day BY 2015)Spock Framework (Java Day BY 2015)
Spock Framework (Java Day BY 2015)
 
JavaScript Performance Patterns
JavaScript Performance PatternsJavaScript Performance Patterns
JavaScript Performance Patterns
 
OOCSS for JavaScript Pirates jQcon Boston
OOCSS for JavaScript Pirates jQcon BostonOOCSS for JavaScript Pirates jQcon Boston
OOCSS for JavaScript Pirates jQcon Boston
 
Progressive Downloads and Rendering - take #2
Progressive Downloads and Rendering - take #2Progressive Downloads and Rendering - take #2
Progressive Downloads and Rendering - take #2
 
Server Side JavaScript - You ain't seen nothing yet
Server Side JavaScript - You ain't seen nothing yetServer Side JavaScript - You ain't seen nothing yet
Server Side JavaScript - You ain't seen nothing yet
 
jQuery Introduction
jQuery IntroductionjQuery Introduction
jQuery Introduction
 
Intro to Sail.js
Intro to Sail.jsIntro to Sail.js
Intro to Sail.js
 
jQuery: Nuts, Bolts and Bling
jQuery: Nuts, Bolts and BlingjQuery: Nuts, Bolts and Bling
jQuery: Nuts, Bolts and Bling
 
End-to-end testing with geb
End-to-end testing with gebEnd-to-end testing with geb
End-to-end testing with geb
 
AMD - Why, What and How
AMD - Why, What and HowAMD - Why, What and How
AMD - Why, What and How
 
Unobtrusive javascript with jQuery
Unobtrusive javascript with jQueryUnobtrusive javascript with jQuery
Unobtrusive javascript with jQuery
 
React.js & Om: A hands-on walkthrough of better ways to build web UIs
React.js & Om: A hands-on walkthrough of better ways to build web UIsReact.js & Om: A hands-on walkthrough of better ways to build web UIs
React.js & Om: A hands-on walkthrough of better ways to build web UIs
 
JavaScript!
JavaScript!JavaScript!
JavaScript!
 
the 5 layers of web accessibility - Open Web Camp II
the 5 layers of web accessibility - Open Web Camp IIthe 5 layers of web accessibility - Open Web Camp II
the 5 layers of web accessibility - Open Web Camp II
 
jQuery Features to Avoid
jQuery Features to AvoidjQuery Features to Avoid
jQuery Features to Avoid
 
Write Less Do More
Write Less Do MoreWrite Less Do More
Write Less Do More
 

Destacado

Destacado (8)

Webinar: MongoDB 2.4 Feature Demo and Q&A on Geo Capabilities
Webinar: MongoDB 2.4 Feature Demo and Q&A on Geo CapabilitiesWebinar: MongoDB 2.4 Feature Demo and Q&A on Geo Capabilities
Webinar: MongoDB 2.4 Feature Demo and Q&A on Geo Capabilities
 
(Codemotion 2014) 20 lenguajes en 40 minutos
(Codemotion 2014) 20 lenguajes en 40 minutos(Codemotion 2014) 20 lenguajes en 40 minutos
(Codemotion 2014) 20 lenguajes en 40 minutos
 
(Greach 2015) Dsl'ing your Groovy
(Greach 2015) Dsl'ing your Groovy(Greach 2015) Dsl'ing your Groovy
(Greach 2015) Dsl'ing your Groovy
 
[Greach 2016] Down The RabbitMQ Hole
[Greach 2016] Down The RabbitMQ Hole[Greach 2016] Down The RabbitMQ Hole
[Greach 2016] Down The RabbitMQ Hole
 
(Codemotion 2014) JVM GC: WTF?!
(Codemotion 2014) JVM GC: WTF?!(Codemotion 2014) JVM GC: WTF?!
(Codemotion 2014) JVM GC: WTF?!
 
(Greach 2015) Decathlon Sport Meeting
(Greach 2015) Decathlon Sport Meeting(Greach 2015) Decathlon Sport Meeting
(Greach 2015) Decathlon Sport Meeting
 
[Jbcn 2016] Garbage Collectors WTF!?
[Jbcn 2016] Garbage Collectors WTF!?[Jbcn 2016] Garbage Collectors WTF!?
[Jbcn 2016] Garbage Collectors WTF!?
 
[Greach 17] make concurrency groovy again
[Greach 17] make concurrency groovy again[Greach 17] make concurrency groovy again
[Greach 17] make concurrency groovy again
 

Similar a Understanding GORM (Greach 2014)

Plugging holes — javascript memory leak debugging
Plugging holes — javascript memory leak debuggingPlugging holes — javascript memory leak debugging
Plugging holes — javascript memory leak debugging
Mayflower GmbH
 
Hibernate Tutorial
Hibernate TutorialHibernate Tutorial
Hibernate Tutorial
Ram132
 
Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}
.toster
 
NoSQL: Why, When, and How
NoSQL: Why, When, and HowNoSQL: Why, When, and How
NoSQL: Why, When, and How
BigBlueHat
 
Sprout core and performance
Sprout core and performanceSprout core and performance
Sprout core and performance
Yehuda Katz
 
Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.
Peter Higgins
 

Similar a Understanding GORM (Greach 2014) (20)

Understanding Database Transactions and Hibernate Sessions in Grails
Understanding Database Transactions and Hibernate Sessions in GrailsUnderstanding Database Transactions and Hibernate Sessions in Grails
Understanding Database Transactions and Hibernate Sessions in Grails
 
Plugging holes — javascript memory leak debugging
Plugging holes — javascript memory leak debuggingPlugging holes — javascript memory leak debugging
Plugging holes — javascript memory leak debugging
 
Building DSLs with Groovy
Building DSLs with GroovyBuilding DSLs with Groovy
Building DSLs with Groovy
 
Async queue-transaction
Async queue-transaction Async queue-transaction
Async queue-transaction
 
Hibernate Tutorial
Hibernate TutorialHibernate Tutorial
Hibernate Tutorial
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 
Week3
Week3Week3
Week3
 
Intro to IndexedDB (Beta)
Intro to IndexedDB (Beta)Intro to IndexedDB (Beta)
Intro to IndexedDB (Beta)
 
Introduction to the new official C# Driver developed by 10gen
Introduction to the new official C# Driver developed by 10genIntroduction to the new official C# Driver developed by 10gen
Introduction to the new official C# Driver developed by 10gen
 
NodeJS
NodeJSNodeJS
NodeJS
 
Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}Matthew Eernisse, NodeJs, .toster {webdev}
Matthew Eernisse, NodeJs, .toster {webdev}
 
The Inclusive Web: hands-on with HTML5 and jQuery
The Inclusive Web: hands-on with HTML5 and jQueryThe Inclusive Web: hands-on with HTML5 and jQuery
The Inclusive Web: hands-on with HTML5 and jQuery
 
NoSQL: Why, When, and How
NoSQL: Why, When, and HowNoSQL: Why, When, and How
NoSQL: Why, When, and How
 
Ember background basics
Ember background basicsEmber background basics
Ember background basics
 
JavaScript: Ajax & DOM Manipulation
JavaScript: Ajax & DOM ManipulationJavaScript: Ajax & DOM Manipulation
JavaScript: Ajax & DOM Manipulation
 
Sprout core and performance
Sprout core and performanceSprout core and performance
Sprout core and performance
 
MongoDB .local Toronto 2019: Using Change Streams to Keep Up with Your Data
MongoDB .local Toronto 2019: Using Change Streams to Keep Up with Your DataMongoDB .local Toronto 2019: Using Change Streams to Keep Up with Your Data
MongoDB .local Toronto 2019: Using Change Streams to Keep Up with Your Data
 
Real World Caching with Ruby on Rails
Real World Caching with Ruby on RailsReal World Caching with Ruby on Rails
Real World Caching with Ruby on Rails
 
Look Up Mobile Javascript
Look Up Mobile JavascriptLook Up Mobile Javascript
Look Up Mobile Javascript
 
Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.Your Library Sucks, and why you should use it.
Your Library Sucks, and why you should use it.
 

Último

CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
Health
 

Último (20)

How to Choose the Right Laravel Development Partner in New York City_compress...
How to Choose the Right Laravel Development Partner in New York City_compress...How to Choose the Right Laravel Development Partner in New York City_compress...
How to Choose the Right Laravel Development Partner in New York City_compress...
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
10 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 202410 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 2024
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 

Understanding GORM (Greach 2014)