4

Suite classe de domaine de Grails:Comment ajuster les contraintes/mapping DB pour carte dans Grails domaine classe

class MyClass { 
    Map myMap 
} 

maintenant pour myMap, Grails crée automatiquement une nouvelle table pour les éléments de la carte. Cependant, si j'ajoute des éléments qui sont trop longs (par exemple 1024 caractères), j'obtiens une erreur DB.

Puis-je dire en quelque sorte Grails de faire la colonne correspondante dans la table de myMap assez grand pour permettre de plus grandes chaînes, ou dois-je faire manuellement dans la base de données?

Je l'ai déjà essayé

static constraints = { 
    myMap(maxSize:1024) 
} 

qui ne fonctionne pas (comme prévu parce maxSize doit se référer aux valeurs de la carte et non à la carte elle-même).

Si non par des contraintes, peut-être il y a une façon de le faire via

?

Répondre

5

Une autre approche j'étais avec succès pour pousser la carte dans une collection à une classe de domaine collaborateur.

class DynaProperty { 
    String name 
    String value 

    static belongsTo = MyClass 
    static constraints = { 
     value(maxSize:4000) //Or whatever number is appropriate 
    } 
} 

Et puis dans MyClass:

class MyClass { 
    static hasMany = [dynaProperties:DynaProperty] 
} 

C'est presque une carte, et il vous donne la possibilité d'utiliser trouveurs dynamiques pour tirer vers le haut une entrée individuelle.

+0

Merci, c'est comme ça que je l'ai finalement fait. J'ai essayé d'écraser le setter de sorte que vous puissiez passer directement une Map en tant que paramètre, mais cela n'a pas fonctionné - par ex. public void setdynaProperties (Map map) {map.each {this.addToDynaProperties (nom: it.key.toString(), valeur: it.value.toString())}}. Au moins, cela n'a pas fonctionné avec le constructeur. –

+0

Cool, je suis heureux que la solution globale a fonctionné pour vous. Je suis curieux de savoir quelle était l'erreur avec votre setter? Je sais que j'ai eu des problèmes avec essayer de "simuler" une propriété avec une signature de méthode typée et que si j'avais utilisé "def" (au lieu de "public void") cela avait tendance à marcher. Mais cela peut s'appliquer plus aux getters qu'aux setters. –

0

ce que vous essayez d'accomplir? Y a-t-il toujours le même nombre de choses sur la carte? Si c'est le cas, vous devriez définir ces propriétés sur votre classe.

Vous pouvez voir le problème avec votre approche actuelle - il n'y a pas moyen de savoir ce qui pourrait être la carte jusqu'à ce que l'exécution, alors comment pouvez Grails éventuellement créer une colonne pour elle? Im surpris il a même travaillé pour commencer ...

+2

En fait, les cartes sont prises en charge très bien. Les clés doivent être des chaînes. Cependant, je pense que vous auriez besoin de modifier le fichier de configuration hibernate sous-jacent pour modifier la table créée pour la carte. Voir http://grails.org/doc/latest/guide/5.%20Object%20Relational%20Mapping%20(GORM).html#5.2.4%20Sets%2C%20Lists%20and%20Maps (section 5.2. 4 Ensembles, listes et cartes - J'ai du mal à obtenir le lien correct.). –