【问题标题】:Booleans in grails aren't persisted?grails中的布尔值没有持久化?
【发布时间】:2010-10-25 21:34:59
【问题描述】:

我正在 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”始终为空。

这可能是什么原因造成的?这发生在我所有的域类中。

【问题讨论】:

  • 我从来没有遇到过任何问题。也许您的代码简化版本没有向我们展示可能导致错误的原因。你能发布一个更大的sn-p代码吗?您的字段实际上是否命名为present?或者它可能是mysql中的保留字?
  • 另外,当你将字段设为Boolean(而不是原始的boolean)时会发生什么?这会改变行为吗?

标签: grails groovy boolean grails-orm


【解决方案1】:

您如何查询该列? “空”是指空吗?默认情况下,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
}

【讨论】:

    【解决方案2】:

    问题可能出在其他地方。我在 Grails 1.2 中编写了一个使用布尔值和 MySql 并且没有持久性问题的应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-27
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 2014-09-02
      相关资源
      最近更新 更多