I've created the Race applications from the book, "Getting Started With Grails, 2nd Edition" by Jason Rudolph. After creating the Runner domain class, I add "package racetrack", then I try to bootstrap some data.
1: class BootStrap {
2: def init = { servletContext ->
3: def jane = new Runner(firstName:'Jane',lastName:'Doe')
4: jane.save()
5: }
6: def destroy = {}
7: }
But, when I run the application, I don't get any data populated and no error.
The answer was in #GRAILS-3842. In order to create the data, you MUST set the values for "ALL PROPERTIES THAT ARE NOT NULLABLE".
So, when you create a new Runner(), you must supply values for all properties or mark the properties as "nullable:true". Also, there is a new parameter for the save() method, save(failOnError:true). This will cause the compilation to fail if the save() method in Bootstrap does not work.
Here is the new code:
1: class Runner {
2:
3: static constraints = {
4: firstName(blank:false)
5: lastName(blank:false)
6: dateOfBirth(nullable:true)
7: gender(inList:["M", "F"])
8: address(nullable:true)
9: city(nullable:true)
10: state(nullable:true)
11: zipcode(nullable:true)
12: email(email:true)
13: }
14: static hasMany = [registrations:Registration]
15: String firstName
16: String lastName
17: Date dateOfBirth
18: String gender
19: String address
20: String city
21: String state
22: String zipcode
23: String email
24: String toString(){
25: "${lastName}, ${firstName} (${email})"
26: }
27:
28:
29:
30:
31:
32:
33: class BootStrap {
34:
35: def init = { servletContext ->
36: def jane = new Runner(firstName:'Jane', lastName:'Doe', gender:'F',city:'Atlanta',state:'GA',email:'jane@toto.com')
37: jane.save(failOnError:true)
38: def joe = new Runner(firstName:'Joe', lastName:'Blow', gender:'M',city:'Atlanta',state:'GA',email:'joe@toto.com')
39: joe.save(failOnError:true)
40: def larry = new Runner(firstName:'Larry', lastName:'Eisenstein', gender:'M',city:'Lilburn',state:'GA',email:'larrye@toto.com')
41: larry.save(failOnError:true)
42:
43: }
44: