2010-05-15 4 views
8

Wydaje się, że istnieją dwa różne sposoby deklarowania posortowane skojarzenia w Grails:Jaki jest najlepszy sposób deklarowania posortowanego asocjacji w klasach domen grails?

Metoda 1 (patrz here) przy użyciu domyślnego sortowania

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

Metoda 2 (patrz here) używanie SortedSet

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

Nie jestem pewien, którego użyć i jaka jest różnica (jeśli w ogóle), plusy i minusy między używaniem jednego względem drugiego.

Byłbym wdzięczny za wszelkie wyjaśnienia.

Dziękuję

+0

Znajdź odpowiedź, jeśli jest to pomocne: http://stackoverflow.com/a/32540716/659949 –

Odpowiedz

6

zacząłem kopać, jak to wszystko prace, a potem okazało się, że metoda 1 jest faktycznie odpadł na aktualnych wersjach Grails (testowane zarówno w 1.2.1 i 1.3). Podczas próby odzyskania autora i obejrzenia jego książek, zgłasza wyjątek:

Występuje w nim otwarta wada (4089), która była otwarta przez dłuższy czas.

Oto wyjątek, który zostaje wrzucony:

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] 

Jeśli i kiedy wreszcie go naprawić, różnice między tymi dwoma metodami jest to, że w jednej metody, sortowanie odbywa się na poziomie bazy danych. Jak widać w powyższym wyjątku, GORM próbował wykonać "order by books0_.title", który używałby dowolnego indeksu bazy danych w polu book.title i zwracał obiekty w tej kolejności.

Druga metoda posortowałaby obiekty w pamięci w momencie ich wstawienia do zestawu (przy użyciu zdefiniowanej metody compareTo).

Do czasu usunięcia bieżącego błędu, użyłbym metody 2, ponieważ jest to jedyna rzecz, która działa. Powinno być dobre dla stosunkowo niewielkich zbiorów rzeczy. Po jego usunięciu potencjalnie wolałbym metodę 1, ponieważ baza danych powinna być szybsza podczas sortowania z indeksem w polu sortowania.

+0

Dokładnie to, czego potrzebowałem! Dziękuję Ci! Używam również metody 2, ale gdy przejrzałem Graves-1.2, zauważyłem, że metoda 1 i ja również zakładaliśmy, że sortowanie zostało wykonane na poziomie DB, który jest nieco lepszy niż SortedSet. Zrobię to jak ty: czekanie na naprawienie tego błędu i przełączenie raz zrobione. Jedno pytanie: w metodzie 1, jeśli został zadeklarowany jako taki, książki są instancją os Ustawione poprawnie? – fabien7474

+0

Tak, będziesz mieć książki jako zestaw. Set jest domyślnym zbiorem grails, po prostu nie są normalnie posortowane (więc są HashSet). Jeśli chcesz, aby były listami, musisz zadeklarować je jawnie. –

+0

Mimo że połączona jira jest oznaczona jako "Nie naprawia", [obejście] (http://jira.grails.org/browse/GRAILS-4089?focusedCommentId=65583&page=com.atlassian.jira.plugin.system. issuetabpanels: comment-tabpanel # comment-65583) polega na "uczynieniu relacji dwukierunkową z' Book {... static belongsTo = [author: Author]}. " – GreenGiant

Powiązane problemy