Булевы в Grails не сохранились? - PullRequest
2 голосов
/ 26 октября 2010

Я разрабатываю небольшое приложение на Grails 1.3.5 и сталкиваюсь с этой очень странной проблемой.

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

Например, у меня есть этот класс домена "Сотрудник", определенный следующим образом (упрощенно):

class Employee {
 String name
 boolean present
} 

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 26 октября 2010

Как вы опрашиваете колонку? Под «пустым» вы подразумеваете ноль? По умолчанию Hibernate + MySQL сохраняет булевы значения как биты со значением 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 голосов
/ 26 октября 2010

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

...