2010-05-15 9 views
8

Il semble qu'il existe deux façons différentes de déclarer associations classées dans Grails:Quelle est la meilleure façon de déclarer l'association triée dans les classes de domaine grails?

Méthode 1 (voir here) en utilisant l'ordre de tri par défaut

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

Méthode 2 (voir here) utilisant SortedSet

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

Je ne suis pas sûr de savoir lequel utiliser et quelle est la différence (le cas échéant), les avantages et les inconvénients entre l'utilisation de l'un contre l'autre.

J'apprécierais toute clarification.

Merci

+0

Trouvez ma réponse si cela vous est utile: http://stackoverflow.com/a/32540716/659949 –

Répondre

6

j'ai commencé à creuser dans la façon dont tout cela fonctionne et a ensuite constaté que la méthode 1 est en fait Busted dans les versions actuelles de Grails (testé à la fois 1.2.1 et 1.3). Lorsque vous essayez de récupérer un auteur et de regarder ses livres, il lance une exception

Il y a un défaut ouvert (4089) qui est ouvert depuis longtemps.

est ici l'exception qui est jeté:

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 et quand ils ont finalement réparer, les différences entre les deux méthodes sont que dans la méthode un, le tri se fait au niveau de la base de données. Comme vous pouvez le voir dans l'exception ci-dessus, GORM essayait de faire une "commande par books0_.title" qui utiliserait n'importe quel index de base de données sur le champ book.title et retournerait les objets dans cet ordre.

La deuxième méthode trie les objets en mémoire au moment où ils sont insérés dans l'ensemble (en utilisant la méthode compareTo qui a été définie).

Jusqu'à ce que le bogue actuel soit corrigé, j'utiliserais la méthode 2 parce que c'est la seule chose qui fonctionne. Cela devrait convenir à des collections relativement petites. Après que ce soit corrigé, je préférerais potentiellement la méthode 1 car la base de données devrait être plus rapide à faire le tri avec un index sur le champ de tri.

+0

Exactement ce dont j'avais besoin! Je vous remercie! J'utilise aussi la méthode 2, mais quand j'ai lu Grails-1.2 Release Notes, j'ai découvert la méthode 1 et je supposais aussi que le tri était fait au niveau DB, ce qui est un peu mieux que SortedSet. Je ferai comme vous: attendre que ce bug soit corrigé et changer une fois terminé. Une question: dans la méthode 1, si déclaré tel quel, books est une instance os Set right? – fabien7474

+0

Oui, vous aurez des livres en Set. Set est la valeur par défaut pour les collections de grails, ils ne sont normalement pas triés (donc ils sont un HashSet). Si vous voulez qu'ils soient une liste, vous devez le déclarer explicitement. –

+0

Bien que le jira lié soit marqué comme "ne corrigera pas", la [solution de contournement] (http://jira.grails.org/browse/GRAILS-4089?focusedCommentId=65583&page=com.atlassian.jira.plugin.system. emissionetabpanels: comment-tabpanel # comment-65583) est de "rendre la relation bidirectionnelle avec' Book {... static belongsTo = [author: Author]} '." – GreenGiant

Questions connexes