2011-07-28 3 views
1

J'ai une classe de domaine de Grails je dois persister dans Redis, quelque chose comme ceci:Redis (Grails plugin) ne persiste pas Enum objet

class A { 
    String one 
    Integer two 

    B three 

    E four 

    mapWith = "redis" 
} 

class B { 
    String name 
} 

enum E { 
    VALUE1, VALUE2 
} 

Quand je persiste une instance de la classe A avec le Gorm Méthode .save(), Redis l'enregistre correctement sauf pour le champ enum "quatre".

Comme vous pouvez le voir le fait est connu et rapporté ici: http://jira.grails.org/browse/GPREDIS-3

est-il une bonne solution pour sauver Enum ou quelque chose de similaire? Nous pensons à un tableau d'objets String, qu'en pensez-vous?

Répondre

3

Je l'ai principalement implémenté mais cela ne fonctionne pas pour Gemfire et j'attends qu'il soit corrigé pour tous les fournisseurs nosql supportés avant de pousser le correctif. En guise de solution de contournement, vous pouvez utiliser la contrainte inList avec une combinaison d'une propriété persistante String et d'une paire get/set non persistante portant le nom de votre propriété actuelle, par ex.

class A { 
    String one 
    Integer two 

    B three 

    String fourString 

    void setFour(E e) { 
     fourString = e?.name() 
    } 
    E getFour() { 
     fourString ? E.valueOf(fourString) : null 
    } 

    static constraints = { 
     fourString inList: E.values()*.name() 
    } 

    static transients = ['fourString'] 

    static mapWith = "redis" 
} 
+0

J'aime la solution que vous proposez, je vous remercie Burt :) – lucke84

+0

Pour faire ce travail, je l'ai supprimé la cartographie des « transitoires », sinon le getter n'a pas été en mesure de récupérer le terrain par l'in- chaîne correspondante de fait-non-persistée. Est-ce que je me trompe? Pourquoi avez-vous indiqué de mettre la chaîne comme un champ transitoire? – lucke84

+1

Désolé, devrait être «quatre» puisque c'est juste une paire get/set. –