Avant de continuer avec ma réponse, je tiens à préciser que avec Grails 1.2.x (peut-être aussi avec 1.3.x) les contraintes d'unicité composées sont cassées si l'une des valeurs peut être nulle. Si vous ne pouvez pas vous passer d'un comportement unique, vous pouvez utiliser une validation personnalisée pour contourner le problème. Voir : https://cvs.codehaus.org/browse/GRAILS-5101
La manière appropriée d'accomplir que votre classe de domaine Metric soit unique pour les champs nom, personne et corporation.
class Metric {
String name
float value
Person person
Corporation corporation
static belongsTo = [person: Person, corporation: Corporation]
static indexes = {
name()
}
static constraints = {
name(unique:['person', 'corporation'])
person(unique:['name', 'corporation'])
corporation(unique:['name', 'person'])
}
}
Vous devrez déclarer personne et corporation comme membres de votre modèle. Vous pouvez même supprimer le static belongsTo si vous ne vous souciez pas du comportement de suppression en cascade.
Dans l'exemple ci-dessus, le nom doit être unique dans personne et corporation; la personne doit être unique dans le nom et la corporation, et enfin la corporation doit être unique dans le nom et la personne.