1

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

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

这在 Grails 1.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)
}

如果我注释掉class 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[] photodef photo那里没有任何作用 - 添加映射也没有。对于 Java 程序员来说非常混乱。

4

4 回答 4

4

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

使用约束

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

static constraints = {
    photo maxSize: 10000
}

使用列定义

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

static mapping = {
    photo column: 'photo', sqlType: 'VARBINARY(10000)'
}
于 2013-10-25T17:55:51.487 回答
2

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

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

    static constraints = {
        photo(maxSize: 1024 * 1024)
    }
}
于 2013-10-25T16:59:12.057 回答
0

您还可以使用类型定义:

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

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


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

于 2013-10-28T12:08:15.330 回答
0

我也有这个问题。我尝试了大约十几个来自网络的建议 - 它们都没有奏效。

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

于 2014-03-31T01:41:39.493 回答