2010-10-25 3 views
2

Я разрабатываю небольшое приложение на Grails 1.3.5, и я сталкиваюсь с этой очень странной проблемой.Булевы в граале не сохраняются?

В моих классах домена есть несколько булевых типизированных полей. Ни одно из этих полей не сохраняется при создании нового экземпляра (и, конечно же, его сохранении).

К примеру, у меня есть этот класс домен «Сотрудник», определяется следующим образом (упрощенно):

class Employee { 
String name 
boolean present 
} 

Когда я создаю новый экземпляр этого класса, и я упорно его, имя сохраняется, но названный булев не является.

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

При сохранении не возникает ошибки. Однако в базе данных (я использую MySQL) двоичный столбец «присутствует» всегда остается пустым.

Что может быть причиной этого? Это происходит во всех моих классах домена.

+0

У меня никогда не было проблем с этим. Возможно, ваша упрощенная версия кода не показывает нам, что может вызвать ошибку. Можете ли вы опубликовать большой фрагмент кода? Действительно ли ваше поле называется 'present'? Или это что-то еще, что может быть зарезервированным словом в mysql? –

+0

Также, когда вы делаете поле 'Boolean' (вместо примитивного' boolean')? Это изменяет поведение? –

ответ

5

Как вы запрашиваете колонку? «Пустое» означает «нуль»? По умолчанию Hibernate + MySQL будет сохранять booleans как бит со значением 0 или 1, поэтому при запуске «select * from foo» значения выглядят пустыми. Вы можете бросить в ряд, хотя:

select name, CAST(present AS UNSIGNED) from employee

Другая вещь, которую вы можете сделать, это использовать пользовательский Диалект, которая сохраняется с помощью «булево» типа вместо бита:

package com.yourcompany.yourapp 

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

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

Регистрация это DataSource.groovy как

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

Возможностей в другом месте. Я написал приложение в Grails 1.2, которое использует booleans и MySql и не имеет проблем с сохранением.

Смежные вопросы