grails中的布尔没有坚持?

Raj*_*Dee 2 grails groovy boolean grails-orm

我正在Grails 1.3.5上开发一个小应用程序,我遇到了这个非常奇怪的问题.

我的域类具有一些布尔类型字段.创建新实例时(当然保存它),这些字段都不会保留.

例如,我有这个域类"Employee",定义如下(简化):

class Employee {
 String name
 boolean present
} 
Run Code Online (Sandbox Code Playgroud)

当我创建该类的新实例并且我坚持它时,名称被保存,但是当前命名的布尔值不是.

def newEmp = new Employee(name: "me", present: true)
newEmp.save(failOnError: true, flush: true)
Run Code Online (Sandbox Code Playgroud)

保存时,不会抛出任何错误.但是,在数据库(我使用MySQL)中,二进制列"present"始终为空.

可能是什么导致了这个?这发生在我的所有域类中.

Bur*_*ith 6

你是如何查询专栏的?'空'你的意思是null吗?默认情况下,Hibernate + MySQL会将布尔值保持为0或1的位,因此当运行"select*from foo"时,值看起来是空白的.你可以投射到一个数字:

select name, CAST(present AS UNSIGNED) from employee

您可以做的另一件事是使用自定义Dialect,它使用'boolean'类型而不是一点:

package com.yourcompany.yourapp

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

class MyDialect extends MySQL5InnoDBDialect {
   public MyDialect() {
      registerColumnType(Types.BIT, "boolean")
   }
}
Run Code Online (Sandbox Code Playgroud)

在DataSource.groovy中注册为

dataSource {
   pooled = true
   driverClassName = 'com.mysql.jdbc.Driver'
   username = '...'
   password = '...'
   dialect = com.yourcompany.yourapp.MyDialect
}
Run Code Online (Sandbox Code Playgroud)