🌱 Grails
The framework you inherited, or the one DataPallas custom work is written in — convention over configuration on Spring Boot, GORM in depth, why save() returns null instead of throwing, the N+1 that looks like a field access, and changing an application you did not write without breaking it.
No lessons published yet — this is the roadmap, so you can see exactly what the course will cover before it lands.
Before you start: Spring Boot — Series 1, and Series 2. Grails is Spring Boot underneath, and the second time something behaves strangely the answer will be a bean or an auto-configuration. Series 2 in particular — reading why a bean exists — is what turns this framework from magic into a system you can debug.
Before you start: Java & Groovy for Data — Series 1, and Series 4. GORM is Hibernate wearing Groovy, so the persistence context, lazy loading and the N+1 are assumed here rather than taught. Series 4 is where they were taught.
Short on time? The 20 episodes marked core are the shortest path to being productive at work. Start there and pick up the rest whenever a job asks for them.
Series 1 · The Application and Its Conventions
the layout, the command line, and what convention actually means
- 01
Convention Over Configuration — Why the Folder a Class Sits In Is the Wiring
coreintermediatecoming soon - 02
The CLI and the Build — Getting an Application You Did Not Write to Start
coreintermediatecoming soon - 03
Domain Classes — Constraints, the Mapping Block, and Where the Schema Comes From
coreintermediatecoming soon - 04
Controllers, Data Binding and Command Objects — and the Field You Did Not Mean to Expose
coreintermediatecoming soon - 05
Services Are Transactional by Default — Where the Work Belongs, and Where It Commits
coreintermediatecoming soon - 06
Project — Add One Screen and One Table to an Application You Did Not Write
coreintermediate#projectcoming soon
Series 2 · GORM, in Depth
the largest part of the guide, and of the job
- 01
Four Ways to Ask — Dynamic Finders, where, Criteria and HQL
coreadvancedcoming soon - 02
hasMany, belongsTo and Cascade — What the Keyword Did to Your Delete
coreadvancedcoming soon - 03
save() Returns null — the Silent Data Loss in Half the Grails Code in the World
coreadvancedcoming soon - 04
The Session Underneath — Why a Load of 100,000 Rows Runs Out of Memory
coreadvancedcoming soon - 05
The N+1 Through GORM — When a Field Access Is Secretly a Query
coreadvancedcoming soon - 06
Migrations — Turning dbCreate Off Before Production Turns It Off for You
coreadvancedcoming soon - 07
Project — Import a Large File Through the Domain Model Without Exhausting Memory
coreadvanced#projectcoming soon
Series 3 · Grails as a Back End
URL mappings, JSON, interceptors and security
- 01
UrlMappings — the Fastest Map of an Application You Inherited
coreadvancedcoming soon - 02
JSON Views — Why Rendering a Domain Object Leaks Fields and Fires Queries
coreadvancedcoming soon - 03
Interceptors — One Place for the Thing Every Request Needs
advancedcoming soon - 04
Spring Security in Grails — Roles, the Request Map, and Binding as a Hole
coreadvancedcoming soon - 05
Background Work — and Why a Detached Domain Object Throws on the Other Thread
advancedcoming soon - 06
Project — Expose an Inherited Domain Model as a Shaped, Secured JSON API
coreadvanced#projectcoming soon
Series 4 · Testing, Plugins and Shipping
changing an inherited application safely, and getting it out
- 01
Unit, Integration and Functional — What to Write First on Code With No Tests
coreadvancedcoming soon - 02
resources.groovy — Where the Conventions Stop and Spring Boot Starts
advancedcoming soon - 03
Plugins — What They Contribute, and Checking the Last Release Date First
advancedcoming soon - 04
Jar or War — Building It, Configuring It Outside, and Handing It Over
coreadvancedcoming soon - 05
Upgrading, or Not — Deciding Honestly What to Do With an Application You Inherited
advancedcoming soon - 06
Project — Change Behaviour in an Inherited Application, Test First
coreadvanced#projectcoming soon
Not here, on purpose
- The Groovy language itself — covered in Java & Groovy for Data, Series 1
- Hibernate's own behaviour — the persistence context, lazy loading, the N+1, batching — covered in Java & Groovy for Data, Series 4. In this course, Series 2 · 20 shows where GORM hides that behaviour rather than re-teaching it
- The container, auto-configuration, Actuator and packaging — covered in Spring Boot, which this course assumes. In this course, Series 4 · 05 covers only where Grails and Spring meet
- Front-end frameworks and single-page applications — not covered. Series 3 teaches Grails as a JSON back end, which is how most Grails applications are now used; Next.js is the front end on this shelf
- Running the server and the database — covered in Data Ops