2010-10-25 18 views
2

Je développe une petite application sur Grails 1.3.5 et je rencontre ce problème très étrange.Les booléens dans les grails ne sont pas persistés?

Mes classes de domaine comportent des champs typés booléens. Aucun de ces champs n'est conservé lors de la création d'une nouvelle instance (et l'enregistre bien sûr).

Par exemple, j'ai cette classe de domaine « employé », défini comme suit (simplifié):

class Employee { 
String name 
boolean present 
} 

Lorsque je crée une nouvelle instance de cette classe et je persiste, le nom est enregistré, mais le booléen actuel n'est pas.

def newEmp = new Employee(name: "me", present: true) 
newEmp.save(failOnError: true, flush: true) 

Lors de la sauvegarde, aucune erreur n'est générée. Cependant, dans la base de données (j'utilise MySQL) la colonne binaire "present" reste toujours vide.

Ce qui pourrait être à l'origine de cela? Cela arrive le long de toutes mes classes de domaine.

+0

Je n'ai jamais eu de problème avec ça. Peut-être que votre version simplifiée du code ne nous montre pas ce qui pourrait causer l'erreur. Pouvez-vous poster un extrait de code plus grand? Votre champ est-il réellement nommé 'présent'? Ou est-ce autre chose qui pourrait être un mot réservé dans mysql? –

+0

Aussi, que se passe-t-il lorsque vous faites du champ un 'Boolean' (au lieu d'un' boolean' primitif)? Est-ce que cela change le comportement? –

Répondre

5

Comment interrogez-vous la colonne? Par 'vide' voulez-vous dire nul? Par défaut, Hibernate + MySQL conserve les booléens sous la forme d'un bit avec la valeur 0 ou 1, donc lors de l'exécution de "select * from foo" les valeurs semblent vides. Vous pouvez lancer un nombre si:

select name, CAST(present AS UNSIGNED) from employee

Une autre chose que vous pouvez faire est d'utiliser un Dialect personnalisé qui persiste à l'aide d'un type « booléenne » au lieu d'un bit:

package com.yourcompany.yourapp 

import java.sql.Types 
import org.hibernate.dialect.MySQL5InnoDBDialect 

class MyDialect extends MySQL5InnoDBDialect { 
    public MyDialect() { 
     registerColumnType(Types.BIT, "boolean") 
    } 
} 

Enregistrer ce dans DataSource.groovy as

dataSource { 
    pooled = true 
    driverClassName = 'com.mysql.jdbc.Driver' 
    username = '...' 
    password = '...' 
    dialect = com.yourcompany.yourapp.MyDialect 
} 
0

Les chances sont que le problème est ailleurs. J'ai écrit une application dans Grails 1.2 qui utilise des booléens et MySql et n'a eu aucun problème de persistance.