所以,我的问题是每个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
,然后将其保存。我尝试这样做。
有更好的解决方案吗?
答案 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往往更适合高度可变的数据。 MongoDB和CouchDB都是出色的数据库。每个都有它自己的目的,这超出了这个问题的范围,但是其中一个很可能非常适合任何文档存储需求。