Quelle est la meilleure façon de déclarer l'association triée dans les classes de domaine de Grails?

StackOverflow https://stackoverflow.com/questions/2840364

Question

Il semble qu'il existe deux façons différentes de déclarer des associations classées Grails:

Méthode 1 (voir ) 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 ) en 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 que l'on à 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écierait des éclaircissements.

Merci

Était-ce utile?

La solution

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 réellement de récupérer un auteur et coup d'oeil ses livres, il jette une exception

Il y a un défaut ouvert pour elle ( 4089 ) qui a été ouvert tout à fait un certain temps.

Voici 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 une méthode, 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 un « ordre par books0_.title » qui utiliserait un indice de base de données sur le champ book.title et renvoyer les objets dans cet ordre.

La seconde méthode consiste trier les objets dans la mémoire au moment où ils sont insérés dans l'ensemble (en utilisant la méthode compareTo qui a été défini).

Tant que le bogue actuel est fixé, j'utiliser la méthode 2 parce que c'est la seule chose qui fonctionne. Il devrait être très bien pour les collections relativement petites de choses. Après il est fixé, je préfère potentiellement la méthode 1 que la base de données devrait être plus rapide à faire le tri avec un index sur le champ de tri.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top