2010-11-15 17 views
0

J'ai un postgresql base de données qui a cette structure de colonne:En utilisant hasMany Grails et postgresql

Author 
    id 
    name 

Book 
    id 
    name 
    author_id 

et des classes de domaine Groovy qui repressent ces tables:

class Author { 
    static hasMany = [ books : Book ] 

    Integer id 
    String name 
} 

class Book { 
    static belongsTo = Author 

    Integer id 
    Integer project_id 
    String name 
} 

Mon objectif principal d'obtenir une liste de livres d'une instance d'auteur.

author = Author.get(1) // gets a author 
author.books // must return a list of books. 

Mais cela ne fonctionne pas. Y at-il quelque chose de manifestement évident que je fais mal?

note J'ai beaucoup d'expérience Ruby/Rails et j'ai une expérience Java/Groovy.

+0

Non lié, mais vous devez supprimer les déclarations "Integer id" - Grails ajoute des propriétés id et version pour vous. –

Répondre

2

Changer votre classe Book à:

class Book { 
    static belongsTo = [authors: Author] 

    static mapping = { 
     authors column: 'author_id' 
    } 

    Integer id 
    Integer project_id 
    String name 
} 

Si vous ne spécifiez pas le mapping comme ça, Gorm va créer, respectivement, attendez-vous, une table de jointure par défaut..

(BTW, classes de domaine sont automatiquement pourvu d'un « virtuel » id propriété (de type Long je pense, la traduction à bigint dans PostgreSQL). Il est nécessaire de spécifier manuellement, mais il ne sera pas non plus du mal.)


EDIT: Mise à jour selon les commentaires de questionneurs:

Si un livre peut vraiment ont un seul auteur, vous auriez indiquer dans la Book cla ss:

Author author 
static belongsTo = [author: Author] 

static mapping = { author column: 'author_id' } 

La documentation GORM sur un-à-plusieurs relations se trouve here.

+0

Je vais essayer cela, mais un livre a un auteur et un auteur peut avoir beaucoup de livres .... ressemble à votre mise en place d'un 'book.authors'? – Stefan

+0

aussi, pourriez-vous me diriger vers la documentation qui mentionne cela? (Parce que la documentation sur grails.org ne fait pas ou au moins ... pas sur la surface) – Stefan

+0

S'il vous plaît voir la mise à jour de la réponse. - Il peut être toujours judicieux de définir une base de données en mode create-drop ou update (dans un projet expérimental supplémentaire) pour voir quel schéma de base de données est réellement créé. – robbbert