【问题标题】:Grails Scaffold - Generated MySQL Column Type for JodaTime DateTime fieldGrails Scaffold - 为 JodaTime DateTime 字段生成 MySQL 列类型
【发布时间】:2012-08-15 21:11:46
【问题描述】:

我是 Grails 的新手,我正在使用带有 MySQL 5.5 后端的 Grails 2.1 来构建一个示例项目来学习。

我安装了 JodaTime 1.4 插件,然后运行grails install-joda-time-templates

但是,当我将域类字段声明为 org.joda.time.DateTime 类型时,尝试保存新条目时出现错误。

为了隔离问题,我创建了一个简单的域类:

import org.joda.time.DateTime

class Project
{
    String name
    DateTime startDate

    static constraints = {
        name(blank: false, maxSize: 50)
        startDate(validator: {return (it > new DateTime())})
    }
}

控制器只是将脚手架设置为使用域类。

我的 DataSource.groovy 指定 dbCreate = "create-drop",因为我让 Grails 创建表。

这是我尝试保存时遇到的错误:

Class:com.mysql.jdbc.MysqlDataTruncation
Message:Data truncation: Data too long for column 'start_date' at row 1

当我查看 Grails 创建的 MySQL 数据库中的 project.start_date 列时,类型是 TINYBLOB。

我的想法是 TINYBLOB 可能不足以存储 JodaTime DateTime 字段的数据。

有谁知道如何让 Grails 创建合适的类型?

非常感谢。

【问题讨论】:

  • 你检查过 Joda Time 插件吗? grails.org/plugin/joda-time
  • @SérgioMichels,我做到了,我在 Data BindingScaffolding 上完成了 Grails 章节的 JodaTime 集成,但没有找到一种方法可以强制 JodaTime DateTime 映射到特定的MySQL 类型。
  • 你可以试试静态映射 = { startDate sqlType:'timestampt' } 吗?
  • @Sérgio Michels 谢谢你的这个想法。我试过了,它确实导致由 Grails 创建的 MySQL 表/列具有一种时间戳。当我转到 MySQL Workbench 时,我看到了时间戳类型的 project.start_date。但是,我坚持的时候还是报错,这是一个新的错误:Class:com.mysql.jdbc.MysqlDataTruncation Message:Data truncation: Incorrect datetime value: '¬í' for column 'start_date' at row 1

标签: mysql grails grails-orm


【解决方案1】:

在您的 Config.groovy 中:

grails.gorm.default.mapping = {
    "user-type" type: PersistentDateTime, class: DateTime
    "user-type" type: PersistentLocalDate, class: LocalDate
}

还有你的映射闭包:

static mapping = {
    startDate type: PersistentDateTime
}

查看this post 了解更多信息,看看是否有帮助。

【讨论】:

  • Tiago,成功了,非常感谢您的回答和非常有用的博客文章链接。我必须做的唯一额外更改是为 org.joda.time.contrib.hibernate.PersistentDateTime 依赖项获取 JodaTime Hibernate。我通过在 BuildConfig.groovy 的依赖项闭包中指定 JodaTime Hibernate 1.3 来做到这一点。
  • 太棒了!我很高兴它奏效了。请接受答案以供将来参考。
  • 这不适用于 Grails 2.3.10 和 Hibernate 4。当应用程序启动时我收到 NoClassDefFoundError (SessionImplementor) =/,关于如何为该版本的 Grails 修复它的任何线索?
【解决方案2】:

我做了什么让它工作(Grails 2.1):

1) 添加到 buildConfig:

compile "org.jadira.usertype:usertype.jodatime:1.9"

2) 刷新依赖

3) 运行此命令添加支持的用户类型:

grails install-joda-time-gorm-mappings

4) 最后在域类中:

import org.jadira.usertype.dateandtime.joda.*

static mapping = {
 column_name type: PersistentDateTime
}

在此处找到文档:persistence

【讨论】:

  • 不需要添加静态映射。
猜你喜欢
  • 2022-06-21
  • 2021-04-09
  • 2012-03-18
  • 2018-05-22
  • 2013-02-11
  • 1970-01-01
  • 2012-06-11
  • 2014-12-03
  • 2012-05-13
相关资源
最近更新 更多