Grails Map <string,object>导致异常Integer无法强制转换为String </string,object>

时间:2014-11-14 05:33:31

标签: hibernate grails groovy gorm

所以,我的问题是每个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,然后将其保存。我尝试这样做。

有更好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

Grails manual对你的陈述非常明确:In this case the key and value of the map MUST be strings.

请参阅该部分(“对象的地图”)以获取备用选项(使用地图上的hasMany来定义值类型)。

答案 1 :(得分:1)

在某些时候,地图中的值需要映射到数据库中的列。该数据库列必须具有特定的数据类型。我的 guess 是因为Map<String, Object>对于它所包含的内容非常模糊,GORM只是使该列成为varchar,因此它期望所有内容都是字符串。

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

键/值对

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

使用其他数据库

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