Last updated by 5 years ago

Page: 1.1 Beta1 Release Notes, Version:0

Grails 1.1 Beta 1 Release Notes

28th of November 2008

SpringSource and the Grails development team are pleased to announce the 1.1 Beta 1 release of the Grails web application development framework.

This is the first milestone on the way to the final Grails 1.1 release and includes a number of new features that are detailed in the "New Features" section.

Further information about the release can be obtained using the links below:

New features in 1.1 are described below.

New Features

GORM

Better GORM events

Previously, GORM supported beforeInsert, beforeUpdate and beforeDelete events, now there is afterInsert, afterUpdate and afterDelete to complete the picture

Persistence of Collections of Basic Types

GORM now supports persisting basic types like String, Integer and so on using a join table:

class Person {
   static hasMany = [nicknames:String]
}

Improvements to Data Binding

It is now simpler to bind data to a subset of properties. Previously you could use the syntax:

person.properties = params

Which would bind all the incoming request parameters to the person. If you didn't want that behavior you could use the bindData method. Now you can bind to a subset of properties using the subscript operator:

person.properties["firstName","lastName"] = params

And access a subset of the domain classes properties using the same syntax:

person.properties["firstName","lastName"].each { println it }

Read-Only Access to Objects

Persistent instances can now be loaded in a read-only state using the read method:

def book = Book.read(1)

Default Sort Order

Associations can now be sorted using a default sort order declared at the class level:

class Book {
  String title
  static mapping = {
     sort "title"
  }
}

Or at the association level:

class Author {
    static hasMany = [books:Book]
    static mapping = {
              books sort:"title"
    }
}

Batch Fetching

GORM now supports configuring batch fetching (an optimization of lazy loading) using the ORM DSL at the class level:

class Book {
  String title
  static mapping = {
     batchSize 15
  }
}

Or at the association level:

class Author {
    static hasMany = [books:Book]
    static mapping = {
              books batchSize:15
    }
}

Improvements to Dynamic Finders

There is a new InList suffix that can be used with dynamic finders:

def groovyBooks = Book.findByAuthorInList(['Dierk Koenig', 'Graeme Rocher'])

Dynamic finders can also now use the query cache:

def books = Book.findByTitle("Groovy in Action", [cache:true] )

And upgrade to a pessimistic lock:

def books = Book.findByTitle("Groovy in Action", [lock:true] )

Legacy Mapping for Unidirectional One-to-manys

Unidirectional One-to-many associations can use the joinTable argument to alter the way they map to the underlying database:

class Book {
 String title
 static belongsTo = Author
 static hasMany = [authors:Author]

static mapping = { authors joinTable:[name:"mm_author_books", key:'mm_book_id' ] } } class Author { String name static hasMany = [books:Book] static mapping = { books joinTable:[name:"mm_author_books", key:'mm_author_id'] } }

Plugins

Global Plugins

Plugins can now be installed globally for all applications:

grails install-plugin webtest -global

Multiple Plugin Repositories

Grails now supports the ability to configure multiple plugin repositories by providing a USER_HOMER/.grails/settings.groovy file or a grails-app/conf/BuildSettings.groovy file that contains the configured repository details:

grails.plugin.repos.discovery.myRepository="http://svn.codehaus.org/grails/trunk/grails-test-plugin-repo" 
grails.plugin.repos.distribution.myRepository="https://svn.codehaus.org/grails/trunk/grails-test-plugin-repo"

Automatic Transitive Plugin Resolution

Plugins no longer need to be checked into SVN and will automatically be installed via a plugins metadata when the application is first loaded.

In addition, plugin dependencies are now resolved transitively.

Testing

The Test Framework

The new test framework, available as a plugin for the 1.0.x series, is integrated in Grails 1.1

Scaffolding

Templates and Dynamic Scaffolding

Dynamic scaffolding now uses the templates that can be installed via the install-templates command.

Upgrade notes

Grails 1.1 has a number of changes, but should be mostly backwards compatible with 1.0.x series applications. If you have issues please report them. The following is a list of known issues that need to be considered when upgrading

  • Plugins are not stored in your USER_HOME directory. You will need to re-install your plugins or run:
grails -Dgrails.plugins.dir=./plugins run-app
  • Enums are now mapped onto the database with String values instead of ordinals by default
  • jsession id is now disabled by default. See GRAILS-3364
  • GSP whitespace handling has been changed for the better, you may have more whitespace than before. See GRAILS-3277
  • The The grails.testing.reports.destDir config option has been replaced by grails.project.test.reports.dir
  • PreInit.groovy is now BuildSettings.groovy