我正在Grails 1.3.5上开发一个小应用程序,我遇到了这个非常奇怪的问题。
我的域类具有一些布尔类型字段。创建新实例时不会保留这些字段(并保存当然)。
例如,我有这个域类“Employee”,定义如下(简化):
class Employee {
String name
boolean present
}
当我创建该类的新实例并且我坚持它时,名称被保存,但是当前命名的布尔值不是。
def newEmp = new Employee(name: "me", present: true)
newEmp.save(failOnError: true, flush: true)
保存时,不会抛出任何错误。但是,在数据库中(我使用MySQL),二进制列“present”始终为空。
可能导致这种情况的原因是什么?这发生在我的所有域类中。
答案 0 :(得分:5)
你是如何查询专栏的? '空'你的意思是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")
}
}
在DataSource.groovy中注册为
dataSource {
pooled = true
driverClassName = 'com.mysql.jdbc.Driver'
username = '...'
password = '...'
dialect = com.yourcompany.yourapp.MyDialect
}
答案 1 :(得分:0)
问题在于其他地方。我在Grails 1.2中编写了一个使用布尔和MySql的应用程序,没有持久性问题。