2010-05-15 8 views
8

Parece que hay dos maneras diferentes de declarar asociaciones ordenados en Grails:¿Cuál es la mejor manera de declarar la asociación ordenada en las clases de dominio Grails?

Método 1 (ver here) usando orden predeterminado

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

Método 2 (ver here) utilizando 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 existe), pros y contras entre usar uno contra el otro.

Agradecería cualquier aclaración.

Gracias

+0

Encuentra mi respuesta si es útil para ti: http://stackoverflow.com/a/32540716/659949 –

Respuesta

6

empecé a indagar en cómo funciona todo esto y luego se encontró 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 intenta recuperar un autor y mira sus libros, arroja una excepción

Hay un defecto abierto para él (4089) que ha estado abierto durante bastante 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 puede ver en la excepción anterior, GORM estaba intentando hacer un "pedido por books0_.title" que usaría cualquier índice de base de datos en el campo book.title y devolvería los objetos en ese orden.

El segundo método ordenaría los objetos en la memoria en el momento en que se insertan en el conjunto (utilizando el método compareTo que se definió).

Hasta que se solucione el error actual, utilizaría el método 2 porque es lo único que funciona. Debería estar bien para colecciones relativamente pequeñas de cosas. Después de que se solucione, posiblemente preferiría el método 1, ya que la base de datos debería ser más rápida al hacer la clasificación con un índice en el campo de clasificación.

+0

¡Exactamente lo que necesitaba! ¡Gracias! También estoy usando el método 2, pero cuando revisé las Notas de versión de Grails-1.2, descubrí el método 1 y también suponía que la clasificación se hizo en el nivel de la base de datos, que es algo mejor que SortedSet. Lo haré como usted: esperando a que se solucione este error y lo cambie una vez hecho. Una pregunta: en el método 1, si se declara como tal, books es un conjunto de instancias ¿Correcto? – fabien7474

+0

Sí, tendrás libros como Set. Set es el predeterminado para las colecciones de griales, simplemente no están ordenadas normalmente (por lo que son un HashSet). Si quisieras que fueran una lista, tendrías que declararla explícitamente. –

+0

Aunque la jira vinculada está marcada como "No se corregirá", la [solución alternativa] (http://jira.grails.org/browse/GRAILS-4089?focusedCommentId=65583&page=com.atlassian.jira.plugin.system. issuetabpanels: comment-tabpanel # comment-65583) es para "hacer que la relación sea bidireccional con' Book {... static belongsTo = [author: Author]} '." – GreenGiant

Cuestiones relacionadas