grails - 在不删除现有表的情况下更改Grails GORM格式

标签 grails gorm

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

具体来说,我曾经有一个HashSet字段,该字段映射到DB中的varbinary。该用户表中有一些现有行。

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和文本,但均无效。

我想知道是否有办法让Grails知道该属性现在在HashMap中,并且应生成要转换的新规则,同时将此列保留在DB中的varbinary中。

感谢您的有见地的建议!

编辑:我使用Grails 2.4.4

最佳答案

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

关于grails - 在不删除现有表的情况下更改Grails GORM格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35974707/

相关文章:

hibernate - 有没有办法在不从数据库刷新的情况下刷新hibernate/grails中的实体值

unit-testing - 模拟 domainInstance.validate() 的返回值

eclipse - 在grails中使用graphql插件最终会导致:java.lang.ClassNotFoundException:org.grails.compiler.web.converters.RenderConverterTrait

grails - 修改字段以存储到数据库

ajax - GORM持久性事件监听器

hibernate - 如何使用 hibernate Envers触发实体onLoad()?

grails - Grails-唯一约束未按预期工作

database - 阻止 Grails 在 Controller 方法中打开与数据库的连接

json - chalice 。 JSON。他的方法?

hibernate - Grails GORM-使用聚合函数时如何获取PagedResultList