Grails运行时异常-值对于列“太长”;照片二进制(255)

Grails运行时异常-值对于列“太长”;照片二进制(255),grails,Grails,当使用Grails 2.2.3将jpeg文件(3到8 KB)加载到定义为字节[]的列中时,我遇到了标题异常-错误如下: org.h2.jdbc.JdbcSQLException:PHOTO BINARY(255)列的值太长。SQL语句:更新配置文件集col1=?,…,PHOTO=?,…,coln=?其中id=? 这在Grails1.3.7中运行,使用org.hsqldb.jdbcDriver,但现在总是失败。我应该以不同的方式定义变量吗?如果是,那么是什么 我尝试将所有的byte[]photo代

当使用Grails 2.2.3将jpeg文件(3到8 KB)加载到定义为
字节[]
的列中时,我遇到了标题异常-错误如下:

org.h2.jdbc.JdbcSQLException:PHOTO BINARY(255)列的值太长。SQL语句:更新配置文件集col1=?,…,PHOTO=?,…,coln=?其中id=?

这在Grails1.3.7中运行,使用org.hsqldb.jdbcDriver,但现在总是失败。我应该以不同的方式定义变量吗?如果是,那么是什么

我尝试将所有的
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)
}
如果我注释掉所有以
类ImageController{
开头并以关闭
结尾的代码
这没有区别-因此,我一定是错了,这不是加载图像的地方。但是,在整个应用程序中,我找不到与加载照片直接相关的其他代码。因此,它必须是从Profile.groovy类中提取的:

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程序员来说非常混乱。

使用约束设置字段大小

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

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

使用约束设置字段大小

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

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

您可以使用
约束
映射
闭包来影响hibernate列类型:

使用约束

Grails将检查
maxSize
size
约束,以通知所需列的大小

static constraints = {
    photo maxSize: 10000
}
使用列定义

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

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

您可以使用
约束
映射
闭包来影响hibernate列类型:

使用约束

Grails将检查
maxSize
size
约束,以通知所需列的大小

static constraints = {
    photo maxSize: 10000
}
使用列定义

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

static mapping = {
    photo column: 'photo', sqlType: 'VARBINARY(10000)'
}
您还可以使用以下定义:

static mapping = {
    photo(type:'image')
}
它将自动映射到正确的数据库类型


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

您也可以使用以下定义:

static mapping = {
    photo(type:'image')
}
它将自动映射到正确的数据库类型



确保数据库模式设置/升级正确。

我也遇到了这个问题。我尝试了十几条来自web的建议,但都没有奏效


直到我在DataSource.groovy中为我的开发环境更改了
dbCreate
。我将其设置为“update”,因为我想保留我的数据。然后我猜除非重新创建数据库,否则无法调整数据库列的大小。因此我将其更改为“create,运行grails run应用程序,将其关闭,然后将其切换回“更新”。我不得不重新输入我的所有数据,但从那时起图像上传就起作用了。

我也遇到了这个问题。我尝试了十几条来自网络的建议,但没有一条有效


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

谢谢你,emilan,但它没有改变-仍然是相同的错误。它对我有效。好的。检查DataSource.groovyNo中的dbCreate='create'是否设置为update。这是因为我想保留从一个会话到下一个会话的数据。你能检查一下DB中照片的类型吗,它应该是VARBINARY。另外,您可以通过dbconsole执行select*from information_schema.columns执行该操作;再次感谢你,埃米利安。我在原来的问题中添加了很多代码(我无法在注释中添加格式良好的代码)。我将尝试检查数据库类型。谢谢emilan,但它没有改变-仍然是相同的错误。它对我有效。检查DataSource.groovyNo中的dbCreate='create'是否设置为update。这是因为我想保留从一个会话到下一个会话的数据。你能检查一下DB中照片的类型吗,它应该是VARBINARY。另外,您可以通过dbconsole执行select*from information_schema.columns执行该操作;再次感谢你,埃米利安。我在原来的问题中添加了很多代码(我无法在注释中添加格式良好的代码)。我将尝试检查数据库类型。谢谢你,科德拉克。顺便说一句,我也试着用这个网站上显示的方式来做:<代码>def照片;user.profile.photo=request.getFile('photo'),但这也不起作用。我会尝试你的建议,但是你会知道org.h2.Driver的语法是否相似吗?codelark,映射和约束是互斥的吗。。。贝考