Mostrando entradas con la etiqueta gorm. Mostrar todas las entradas
Mostrando entradas con la etiqueta gorm. Mostrar todas las entradas

Grails hasMany Delete

Suppose the following:
class Group{
    String name
    static hasMany = [users:User]
}

class User{
    String name
}
This means, you have lots of Users for some Group, but also a User might have other Groups, so can't use a "belongsTo". To delete a Group is really easy:
def b = Group.get(0)
b.delete(flush:true)
On the other hand, you might want to delete a User, but not the Group:
def b = User.get(0)
b.delete(flush:true)
This will throw a lot of exceptions from Hibernate and JDBC. How are you supposed to do it? Well, first of all, you'll need a way to get a Group for a given User, but since "users" is transitive, you can't do something like Group.findByUser(user) so go ahead and add the following code to your Group class:
static Group findByUser(User user){
    def criteria = Group.createCriteria()
    def result = criteria.get {
        users {
            idEq(user.id)
        }
    }
    return result
}
Now, go to your UserController delete method and add the following
if (userInstance) {
    try {
        AlertGroup g = Group.findByUser(userInstance)
        if(g){
            g.users.remove(userInstance)
        }
        userInstance.delete(flush: true)
...
The clear call will empty the references in the current object so you don't get any trouble.

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"/>