Grails运行时异常 - 列“PHOTO BINARY(255)”的值太长

时间:2013-10-25 16:51:38

标签: grails

当使用Grails 2.2.3将jpeg文件(3到8 KB之间)加载到定义为byte[]的列中时,我得到了标题异常 - 这是错误:

org.h2.jdbc.JdbcSQLException: Value too long for column "PHOTO BINARY(255) ... SQL statement: update profile set col1=?, ..., photo=?, ..., coln=? where id=?

使用org.hsqldb.jdbcDriver在Grails 1.3.7中工作,但现在总是失败。我应该以不同方式定义变量吗?如果是这样的话?

我尝试将所有byte[] photo代码更改为byte[] photo = new byte[10000],但这根本没有帮助。


我正在回答原来的问题,以回应我给出的答案。首先,谢谢大家。这是DataSource.groovy中的相关代码:

environment {
  developement {
    dataSource {
      dbCreate = "update"
      url = "jdbc:h2:file:devDb:MVCC=TRUE;LOCK_TIMEOUT=10000
    }
  }
}

以下文件和代码是我认为从中加载图像的位置 - ImageController.groovy:

class PhotoUploadCommand {
  byte[] photo
  //def photo      // tried, makes no diff here
  String userId
  static constraints = { photo(maxSize: 1024 * 1024) }  // added as per suggestions
}
class ImageController {
  def imageService
  def upload = { PhotoUploadCommand puc ->
    def user = User.findByUserId(puc.userId)
    user.profile.photo = puc.photo
    //user.profile.photo = request.getFile('photo')  // also tried - N/G
    redirect(controller: 'user', action: 'profile', id: puc.userId)
}

如果我注释掉所有以class ImageController {开头并以结束}结尾的代码,则没有任何区别 - 因此,我一定是错的,这不是从中加载图像的地方。但是,在整个应用程序中没有其他代码可以找到与加载照片直接相关的代码。所以它必须是来自Profile.groovy类的scafolding:

class Profile {
  byte[] photo
  //def photo  // tried, but then the element is removed from the template
  String fullName
  String bio
  String homepage
  String email
  String timezone
  String country
  String jabberAddress
  String skin

  static mapping = {
    photo column: 'photo', sqlType: 'VARBINARY(10000)', nullable: 'true'
    //photo(type: 'image')  // also tried
  }

  static constraints = {
    fullName(nullable: true)
    // ... 
    //photo(nullable: true, maxSize: 1024 * 1024)  // also tried
    photo(nullable: true)
    // ... 
  }

还有一个UserContoller.class包含所有这些相同的列,另外还有:

String userId
String password
String passwordRepeat

...并将byte[] photo更改为def photo没有任何作用 - 也没有添加映射。对Java程序员来说非常困惑。

4 个答案:

答案 0 :(得分:4)

您可以使用constraintsmapping闭包来影响hibernate列类型:

使用约束

Grails将检查maxSizesize约束,以告知必要列的大小。

static constraints = {
    photo maxSize: 10000
}

使用列定义

Grails允许您在映射闭包中指定sql数据类型。这些可以特定于您的数据库供应商,但涵盖约束提示不够灵活以匹配您的数据库架构的情况。例如使用postgres bytea列。

static mapping = {
    photo column: 'photo', sqlType: 'VARBINARY(10000)'
}

答案 1 :(得分:2)

使用约束来设置字段大小。

class MyDomain {
    .....
    byte[] photo

    static constraints = {
        photo(maxSize: 1024 * 1024)
    }
}

答案 2 :(得分:0)

您还可以使用type定义:

static mapping = {
    photo(type:'image')
}

它将自动映射到正确的数据库类型......


确保正确设置/升级数据库架构。

答案 3 :(得分:0)

我也有这个问题。我尝试了网上的十几条建议 - 但都没有奏效。

直到我在 DataSource.groovy 中为我的开发环境更改了dbCreate。我把它设置为" 更新"因为我想保留我的数据然后我猜想除非重新创建数据库,否则无法调整数据库列的大小。所以我将其更改为" 创建",运行grails 运行应用将其关闭,然后将其切换回来到" 更新"。我不得不重新输入我的所有数据,但图片上传从那时开始工作。