Grails Enum

¿Soporta Groovy enums?

Sí, como con cualquier objeto de Java, podemos acceder a ellos desde Groovy. Hacer que estos funcionen con Grails ya es un poco más complicado ya que tenemos que tener en cuenta el comportamiento de Hibernate al encontrarse un enum.

Después de un poco de trial & error, finalmente logre una solución que se ajusta a lo que quería.

public enum BookType{
  EBOOK("eBook"),
  PAPERBACK("PaperBack"),
  HARD("Hard Cover"),
  AUDIO("Audio Book")

  String type

  BookType(String type){
    this.type = type
  }

  static list() {
    [EBOOK, PAPERBACK, HARD, AUDIO]
  }
}

Luego utilizamos este enum en nuestro modelo:

class Book{
  String name
  BookType type

  static constraints = {
     type(nullable:false)
  }
}

Lo mejor de esto es el comportamiento de Hibernate, que crea la tabla book_type con la columna type y enlaza los valores del enum con nuestro modelo. A continuación, podemos utilizar los valores de nuestro enum al crear un libro:

<g:select name="bookType" id="bookType"
from="${BookType.list()}" 
value="${fieldValue(bean: bookInstance, field: 'bookType')}" 
optionValue="type"/>