重命名域类,groovy和grails逆向工程

时间:2017-04-24 19:04:09

标签: grails gorm

如何在逆向工程或逆向工程后重命名域类。

我在Groovy和Grails中使用逆向工程生成了类。

域类名称是AgentTable。我想将其重命名为Agent。当我使用IntelliJ(右键单击 - 重构 - 重命名)重命名域类时,它将AgentTable重命名为Agent,无论它使用何时。但是当我启动服务器(运行应用程序)时,给出错误 "嵌套异常是org.hibernate.HibernateException:缺少表:agent"

我必须为少数域类做这个。无论如何,我可以在对域类进行逆向工程时给出替代名称。

或创建域类之后如何在没有此错误的情况下重命名它。

2 个答案:

答案 0 :(得分:1)

在数据库中查看为代理创建的表的名称。知道表名后,在新域中添加以下内容

static mapping = {
    table "table-name-here"
}

答案 1 :(得分:0)

虽然它有效但我不推荐使用@elixir的方法。

在我看来,映射不应该用于重命名。这也是我理解官方documentation

的方式

在示例中,他们使用它将人物映射到“人物”上。表,不是因为重命名而是因为语义原因。表通常以复数形式命名。 Here对于另一个问题是一个很好的答案。在项目中,我正在处理域对象' User'映射到表'用户'。您无法使用表格名称' user'因为它是一个SQL语句。

假设和澄清:

根据我的经验,Grails会根据这些规则将域名映射到表名称(例如域名' MyExampleDomain':

  • 用大写字母(我的示例域名)

  • 分隔域名
  • 小写全部(我的示例域名)

  • 用下划线替换空格(my_example_domain)

在此之后,您的Domain Class' AgentTable'有一张表'agent_table'在您的相应数据库中。重命名后,Grails甚至会告诉你它想要什么:

  

嵌套异常是org.hibernate.HibernateException:缺少表:代理

它希望在名为“代理商”的表格中查找值。但它找不到它。 IntelliJ的重构函数不重命名函数,因此它将错过数据库。

幸运的是,我们确切地知道它想要的价值 - 以前在'agent_table'中找到的价值。

那么,为什么在我们可以重命名表并完成它时,重新创建域和表名会造成这种混乱?

解决方案:

在您的数据库上执行这样的SQL脚本:

ALTER TABLE <old_domain_name> RENAME TO <new_domain_name>;

这些名字当然是他们的表格形式&#34;。

这只是重命名您的表格以匹配Grails中的预期格式。重启时一切都应该没问题。

但是您不需要使用重命名。您还可以创建一个全新的表,按照域对象希望的方式构建它,然后迁移数据。请参阅&#39;此方法的问题&#39;有关何时使用的信息。

这种方法的问题:

与往常一样,如果您不小心,修补程序所依赖的信息(甚至自己生成)通常会产生一些可怕的后果。

例如,我们必须注意键。如果您的域对象与其他对象有关系,它将通过外键将它们保存在表中。根据您选择迁移表中信息的方式,您可能已删除了这些外键连接。您必须通过单独的SQL语句添加它们。当您选择重新创建表格时,这肯定会发生。重命名它应该保留密钥。

另一个是列名。如果选择重命名属性,则还必须通过SQL重命名列。您还必须记住正在重命名的表上其他表可能具有的外键。 RENAME为我自动完成了这项工作,但您应该仔细检查。

为什么你仍然应该坚持这种方法:

将域对象重新映射到具有旧名称的表必然会产生代码异味和混淆。你真的想记住脑中的这些映射吗?更重要的是:你真的希望其他人能够使用它吗?

最好的情况是,如果人们甚至无法判断这个对象是否曾有过不同的名称,那么更改数据库是我知道的最佳方式。