重命名域类别,凹槽和格雷尔反向工程



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

我使用逆向工程和格里尔的反向工程生成了类。

域类名称是代理的。我想将其重命名为代理。当我使用Intellij重命名域类(右键单击-Rebactor -Rename(时,它将其重命名为代理到代理的使用。但是,当我启动服务器(运行应用程序(时,给出错误"嵌套异常是org.hibernate.hibernateException:缺少表:代理"

我必须在几个域类中执行此操作。无论如何,我可以在逆向域类时提供替代名称。

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

查看您为代理创建的表名称的名称。一旦知道表的名称,请在新域中添加以下内容

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

在起作用时,我不建议@elixir的方法。

我认为,映射不应该用于命名。这也是我理解官方文档的方式。

在示例中,他们用它将人映射到"人"表上,不是因为重命名,而是因为语义原因。表通常以复数形式命名。这是关于此问题的另一个问题的一个很好的答案。在项目中,我正在研究域对象"用户"的"用户"。您无法使用表名"用户",因为它是SQL语句。


假设和澄清:

在我的经验中

  • 通过大写字母(我的示例域(将域名分开

  • 降低情况所有(我的示例域(

  • 用强调替换空格(my_example_domain(

之后,您的域类'代理''在您各自的数据库中具有表'agent_table'。重命名后,Grails甚至告诉您想要什么:

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

它想在称为"代理"的表中查找值,但找不到它。Intellij的重构功能不会重命名函数,因此它将在数据库中错过。

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

那么,当我们可以重命名表并使用它完成时,为什么还会用重新映射域和表名称创建这种混乱?


解决方案:

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

ALTER TABLE <old_domain_name> RENAME TO <new_domain_name>;

名称当然在其"表格"中。

这只会重命名您的表格以匹配Grails中的预期格式。重新启动时,一切都应该很好。

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


这种方法问题:

与往常一样,如果您不小心,则程序取决于(甚至生成的本身(通常会产生一些可怕的后果。

,通常会产生一些可怕的后果。

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

另一个是列名。如果您选择重命名属性,则还必须通过SQL重命名列。您还必须记住外国钥匙的其他桌子可能在您正在重命名的桌子上。重命名为我自动做到这一点,但您应该仔细检查。


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

将域对象重新映射到具有旧名称的表中,即可产生代码气味和混乱。您真的想记住脑海中的这些映射吗?更重要的是:您真的希望其他人必须与此合作?

最好的情况是,如果人们甚至无法确定此对象是否有不同的名称,并且更改数据库是我知道实现这一目标的最佳方法。

最新更新