2011-04-03 2 views
1

Je me sens un peu lent aujourd'hui. J'essaie de faire quelque chose que je trouve très simple. J'ai une classe Domain avec une propriété appelée 'name'. Je veux que 'name' ait un index, et je veux que l'index exige que le 'nom' soit unique. J'ai défini la contrainte unique et essayé de créer un index. Je ne peux pas donner un sens aux documents Gorm quant à la façon dont j'ajoute l'attribut unique à l'index. Voici un code:Cartographie GORM: créer un index unique

class Project { 
    String name 

    static hasMany = [things:Things] 

    static mapping = { 
     name index:'name_idx' 
    } 
    static constraints = { 
     name(unique:true) 
    } 
} 

Tout va bien avec ce qui précède, sauf quand faire « show index de projet » dans une base MySQL, il montre ma clé de nom ne pas unique. Je sais que le problème est que je ne spécifie pas unique dans le mapping, mais franchement les docs pour gorm me font mal à la tête. Je vois toutes sortes de choses sur les colonnes, mais je ne trouve pas un seul exemple sur le web qui montre ce que je veux faire. Je n'ai pas besoin de mappages complexes ou de clés composées, je veux juste connaître la syntaxe pour ajouter l'attribut unique à la déclaration de mappage ci-dessus. Tout conseil est le bienvenu.

J'ai aussi fait une exportation schéma Grails et voir ce qui suit:

create index name_idx on project (name); 

Rien en ce que pour indiquer cet indice nécessite des valeurs uniques

Une question de suivi connexe serait une fois que je réussis à faire que index unique, quel type d'erreur dois-je attendre lorsque je vais enregistrer une instance de Project et que le nom n'est pas unique? Existe-t-il une exception spécifique? Je me rends compte que même si je vérifie qu'un 'nom' donné est unique, il est toujours possible qu'au moment où je le sauvegarde, il y ait une ligne avec ce nom.

Je suis assez sûr que la syntaxe pour faire ce que je veux est simple mais je ne peux pas trouver un exemple simple pour me renseigner. J'ai été à la page this mais cela n'explique pas comment l'unicité est appliquée. Je voudrais l'appliquer au niveau de l'index de nom.

Répondre

2

La propriété indexColumn permet de configurer des options supplémentaires. C'est peut-être ce que vous cherchez.

static mapping = { 
    name indexColumn:[name:'name_idx', unique:true] 
} 

Grails Documentation for indexColumn

+0

Merci Derek. Cela semble en effet juste. Je suppose que mon raclage était que je ne comprenais pas pourquoi je ne pouvais pas le faire avec la syntaxe plus simple, mais à la fin de la journée ce n'est pas si différent! J'ai voté ceci comme la "bonne" réponse. Merci encore. –

+0

Heureux que cela a fonctionné pour votre riche. Puisque c'était votre propre question, au lieu de voter, vous devriez accepter la réponse. :) –