【问题标题】:Grails Map<String,Object> causes exception Integer cannot be cast to StringGrails Map<String,Object> 导致异常 Integer cannot be cast to String
【发布时间】:2014-11-14 05:33:30
【问题描述】:

所以,我遇到的问题是每个 grails 行为都非常奇怪。

域名:-

public class Product {
    Group group  
    Map<String, Object> configuration 
...
...
}

以下是创建新对象时传递的配置。

configuration:[ emailAddress:null, **users:41**...]

上面的用户是Integer,但是当我尝试如下保存对象时。

instance.save flush: true

上面写着:-

Error java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
| Error     at org.hibernate.type.descriptor.java.StringTypeDescriptor.unwrap(StringTypeDescriptor.java:40)
| Error     at org.hibernate.type.descriptor.sql.VarcharTypeDescriptor$1.doBind(VarcharTypeDescriptor.java:52)
| Error     at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:91)

一种解决方案是将integer 转换为string 然后保存它。我试过了。

有没有更好的解决方案?

【问题讨论】:

  • 你能用 save 和 failOnError: true 吗?

标签: hibernate grails groovy grails-orm


【解决方案1】:

Grails manual 中非常清楚地说明了你的情况:In this case the key and value of the map MUST be strings.

请参阅该部分(“对象映射”)以获取替代选项(在您的映射上使用 hasMany 来定义值类型)。

【讨论】:

    【解决方案2】:

    有时,地图中的值需要映射到数据库中的列。该数据库列必须具有特定的数据类型。我的 猜测 是因为 Map&lt;String, Object&gt; 就其包含的内容而言非常模棱两可,GORM 只是将该列设为 varchar,因此它期望所有内容都是字符串。

    如果您需要存储整数和字符串,您有两个不错的选择。这当然是假设您实际上需要使用地图而不是普通属性。

    键/值对

    一种方法是只使用单独的地图,每种类型一张。然后,您可以使用静态 mapping 块来指定您希望如何将它们映射到数据库中的列。 Maps 最终可能会成为存储键/值对的表。这是关系数据库中的一种反模式,可能会使查询该数据变得困难。

    使用另一个数据库

    Document databases 往往更适合高度可变的数据。 MongoDBCouchDB 都是优秀的数据库。每个都有自己的目的,这超出了这个问题的范围,但是两者中的一个很可能非常适合任何文档存储需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多