重命名域类、groovy和grails反向工程
如何在反向工程期间或反向工程之后重命名域类 我在Groovy和Grails中使用反向工程生成了这个类 域类名是可代理的。我想把它重命名为代理。当我使用IntelliJ(右键单击-重构-重命名)重命名域类时,它将AgentTable重命名为使用它的代理。但当我启动服务器(运行应用程序)时,给出错误 “嵌套异常为org.hibernate.HibernateException:缺少表:代理” 我必须为几个域类这样做。无论如何,我可以在反向工程域类时提供一个替代名称重命名域类、groovy和grails反向工程,grails,gorm,Grails,Gorm,如何在反向工程期间或反向工程之后重命名域类 我在Groovy和Grails中使用反向工程生成了这个类 域类名是可代理的。我想把它重命名为代理。当我使用IntelliJ(右键单击-重构-重命名)重命名域类时,它将AgentTable重命名为使用它的代理。但当我启动服务器(运行应用程序)时,给出错误 “嵌套异常为org.hibernate.HibernateException:缺少表:代理” 我必须为几个域类这样做。无论如何,我可以在反向工程域类时提供一个替代名称 或者在创建域类之后,如何重命名它而
或者在创建域类之后,如何重命名它而不出现此错误。在数据库中查找它为代理创建的表的名称。一旦知道表的名称,在新域中添加以下内容
static mapping = {
table "table-name-here"
}
在数据库中查找它为代理创建的表的名称。一旦知道表的名称,在新域中添加以下内容
static mapping = {
table "table-name-here"
}
虽然有效,但我不推荐@elixir的方法 在我看来,映射不应该用于重命名。这也是我对这位官员的理解 在本例中,他们使用它将Person映射到“people”表,这不是因为重命名,而是因为语义原因。表通常以复数形式命名。这是关于另一个问题的一个很好的答案。在我正在处理的项目中,域对象“User”映射到表“users”。不能使用表名“user”,因为它是SQL语句
假设和澄清: 根据我的经验,Grails将域名映射到这些规则之后的表名(例如域名'MyExampleDomain':
- 用大写字母分隔域名(我的示例域)
- 小写全部(我的示例域)
- 用下划线替换空格(我的\u示例\u域)
解决方案: 在数据库上执行如下SQL脚本:
ALTER TABLE <old_domain_name> RENAME TO <new_domain_name>;
将表格重命名为;
这些名字当然是以“表格形式”出现的
这只是重命名您的表以匹配Grails中的预期格式
但是,您不需要使用重命名。您也可以创建一个全新的表,按照域对象希望的方式构建它,然后迁移数据。有关何时使用该表的信息,请参阅“此方法的问题”一节
这种方法的问题: 和往常一样,如果你不小心,修补程序所依赖的信息(甚至是自己生成的信息)通常会产生一些可怕的后果 例如,我们必须注意键。如果您的域对象与其他对象有关系,它将通过外键将它们保存在表中。根据您选择迁移表中信息的方式,您可能已删除这些外键连接。您必须通过单独的SQL语句添加它们。当您选择重新创建表这肯定会发生。重命名它会保留键 另一个是列名。如果您选择重命名属性,您还必须通过SQL重命名列。您还必须记住其他表在您要重命名的表上可能具有的外键。rename为我自动执行此操作,但您应该仔细检查
为什么您仍然应该坚持这种方法: 将域对象重新映射到具有旧名称的表必然会产生代码气味和混乱。您真的想在头脑中记住这些映射吗?更重要的是:您真的希望其他人必须处理这些映射吗
最好的情况是,如果人们甚至不能判断这个对象是否有过不同的名称,而更改数据库是我所知道的实现这一点的最佳方法。虽然它有效,但我不推荐@elixir的方法 在我看来,映射不应该用于重命名。这也是我对官方的理解 在本例中,他们使用它将Person映射到“people”表,不是因为重命名,而是因为语义原因。表通常以复数形式命名。这是关于另一个问题的一个很好的答案。在我正在处理的项目中,域对象“User”映射到表“users”。您不能使用表名“user”,因为它是SQL语句
假设和澄清: 根据我的经验,Grails将域名映射到这些规则之后的表名(例如域名'MyExampleDomain':
- 用大写字母分隔域名(我的示例域)
- 小写全部(我的示例域)
- 用下划线替换空格(我的\u示例\u域)