¿Cuál es la mejor manera de declarar asociación clasificada en clases griales de dominio?
-
27-09-2019 - |
Pregunta
Parece que hay dos maneras diferentes de declarar asociaciones ordenados en Grails:
Método 1 (véase aquí ) usando orden predeterminado
class Book {
String title
}
class Author {
static hasMany = [books : Book]
static mapping = { books sort: "title"}
}
Método 2 (véase aquí ) usando SortedSet
class Book implements Comparable {
String title
int compareTo(obj) {
title <=> obj.title
}
}
class Author {
SortedSet books
static hasMany = [books : Book]
}
No estoy seguro de cuál usar y cuál es la diferencia (si lo hay), pros y contras entre el uso de uno contra el otro.
Le agradecería cualquier aclaración.
Gracias
Solución
Me empezó a excavar en cómo funciona todo esto y luego descubrieron que el método 1 es en realidad eliminado en las versiones actuales de griales (probado tanto en 1.2.1 y 1.3). Cuando realmente se intenta recuperar un autor y mirarlo de libros, se produce una excepción
Hay un defecto abierto para él ( 4089 ) que ha estado abierto durante bastante un tiempo.
Aquí está la excepción de que se tira:
ERROR util.JDBCExceptionReporter - Column not found: BOOKS0_.TITLE in statement [select books0_.author_books_id as author1_0_, books0_.book_id as book2_0_ from author_book books0_ where books0_.author_books_id=? order by books0_.title]
Si y cuando finalmente arreglan, las diferencias entre los dos métodos es que en el método uno, la clasificación se realiza a nivel de base de datos. Como se puede ver en la excepción anterior, GORM estaba tratando de hacer una "orden por books0_.title" que utilizaría cualquier índice de base de datos en el campo book.title y devolver los objetos en ese orden.
El segundo método sería ordenar los objetos en la memoria en el momento que se insertan en el conjunto (utilizando el método compareTo que se definió).
Hasta que el problema actual es fija, usaría el método 2, porque es el único que funciona. Debería estar bien para relativamente pequeñas colecciones de cosas. Después de que se fija, yo prefiero potencialmente método 1 como la base de datos debe ser más rápido en hacer la clasificación con un índice en el campo de ordenación.