2010-05-15 11 views
8

Sembra che ci sono due modi diversi di dichiarare associazioni ordinati in Grails:Qual è il modo migliore per dichiarare l'associazione ordinata nelle classi di dominio Grails?

Metodo 1 (vedi here) utilizzando ordinamento predefinito

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

Metodo 2 (vedi here) utilizzando SortedSet

class Book implements Comparable { 
    String title 
    int compareTo(obj) { 
    title <=> obj.title 
    } 
} 
class Author { 
    SortedSet books 
    static hasMany = [books : Book] 
} 

Non sono sicuro di quale usare e qual è la differenza (se esiste), i pro e i contro tra utilizzarne uno contro l'altro.

Gradirei qualsiasi chiarimento.

Grazie

+0

Trova la mia risposta se è utile per te: http://stackoverflow.com/a/32540716/659949 –

risposta

6

ho iniziato a scavare come funziona tutto questo e poi scoperto che il metodo 1 è in realtà eliminato al attuali versioni di graal (testati in entrambe 1.2.1 e 1.3). Quando si tenta effettivamente di recuperare un autore e guardare i suoi libri, si genera un'eccezione

C'è un difetto aperto per questo (4089) che è stato aperto per un po '.

Ecco l'eccezione che si butta:

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] 

Se e quando finalmente risolvere il problema, le differenze tra i due metodi sono che nel metodo uno, ordinamento è fatto a livello di database. Come puoi vedere nell'eccezione sopra, GORM stava cercando di eseguire un "order by books0_.title" che userebbe qualsiasi indice di database nel campo book.title e restituire gli oggetti in quell'ordine.

Il secondo metodo ordina gli oggetti in memoria nel momento in cui vengono inseriti nel set (utilizzando il metodo compareTo che è stato definito).

Fino a quando il bug corrente non viene risolto, utilizzerei il metodo 2 perché è l'unica cosa che funziona. Dovrebbe andare bene per raccolte relativamente piccole di cose. Dopo che è stato risolto, preferirei il metodo 1 in quanto il database dovrebbe essere più veloce nel fare l'ordinamento con un indice nel campo di ordinamento.

+0

Esattamente quello di cui avevo bisogno! Grazie! Sto anche usando il metodo 2 ma quando ho passato le note di rilascio di Grails-1.2, ho scoperto il metodo 1 e supponevo anche che l'ordinamento fosse fatto a livello di DB che è leggermente migliore di SortedSet. Farò come te: in attesa che questo bug sia corretto e che cambi una volta fatto. Una domanda: nel metodo 1, se dichiarato così com'è, i libri sono un'istanza os Set giusto? – fabien7474

+0

Sì, avrai libri come set. Set è l'impostazione predefinita per le raccolte Grails, non sono ordinate normalmente (quindi sono un HashSet). Se vuoi che siano un elenco, devi dichiararlo esplicitamente. –

+0

Sebbene la jira collegata sia contrassegnata come "Non risolvera", la [soluzione alternativa] (http://jira.grails.org/browse/GRAILS-4089?focusedCommentId=65583&page=com.atlassian.jira.plugin.system. issuetabpanels: comment-tabpanel # comment-65583) è quello di "rendere la relazione bidirezionale con' Book {... static belongsTo = [author: Author]} '." – GreenGiant

Problemi correlati