更改Grails GORM格式而不删除现有表

时间:2016-03-13 19:26:05

标签: grails gorm

我有一个已运行一段时间的Grails应用程序。但现在我想改变GORM格式,我想知道是否有简单的方法可以做到这一点,即我不需要删除现有表格,只修改我的应用程序。

具体来说,我曾经有一个HashSet字段映射到DB中的varbinary。此User表中存在一些现有行。

public class User{
    //irrelevant attributes omitted
    HashSet<String> friends=new HashSet<>();
    static mapping={
        friends sqlType: 'VARBINARY(10000)'
    }

}

现在我已将字段friends更改为HashMap<String,Integer>。现在虽然我仍然将字段映射到varchar,但每次保存User对象时Grails都会抛出异常:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

我首先怀疑Grails保留旧的转换规则将HashSet转换为varbinary并且它没有更新。所以我尝试将varbinary的映射更改为blob和text,但都没有工作。

我想知道是否有方法可以将此列保留在DB中的varbinary中,同时让Grails知道该属性现在位于HashMap中,并且它应该生成新的ruls进行转换。

欣赏你富有洞察力的建议!

编辑:我正在使用Grails 2.4.4

1 个答案:

答案 0 :(得分:2)

我知道有一种方法可以执行此操作:登录数据库服务器,以便您可以在术语窗口中访问数据库。首先在您的开发机器上执行此操作。查看相关列并确切了解它们使用的数据类型。然后,在您的开发计算机上,删除这些列并部署更改的项目。如果您已将gorm设置为“更新”,则会创建新列。&#39;再次检查相关列,看看是否有任何方法可以将生产数据库中的旧列(alter table ...)更改为新列。您必须停止生产服务器,进行更改,部署新项目并重新启动它。如果您不能只更改列,则可能需要创建新列,移动数据并删除旧数据 - 所有这些都会在应用程序服务器停止的情况下完成。