Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重命名域类、groovy和grails反向工程_Grails_Gorm - Fatal编程技术网

重命名域类、groovy和grails反向工程

重命名域类、groovy和grails反向工程,grails,gorm,Grails,Gorm,如何在反向工程期间或反向工程之后重命名域类 我在Groovy和Grails中使用反向工程生成了这个类 域类名是可代理的。我想把它重命名为代理。当我使用IntelliJ(右键单击-重构-重命名)重命名域类时,它将AgentTable重命名为使用它的代理。但当我启动服务器(运行应用程序)时,给出错误 “嵌套异常为org.hibernate.HibernateException:缺少表:代理” 我必须为几个域类这样做。无论如何,我可以在反向工程域类时提供一个替代名称 或者在创建域类之后,如何重命名它而

如何在反向工程期间或反向工程之后重命名域类

我在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域)

接下来,您的域类“AgentTable”在各自的数据库中有一个表“agent\u table”。重命名Grails后,它甚至会告诉您需要什么:

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

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

幸运的是,我们确切地知道它想要什么值——以前在“agent_表”中找到的值

那么,当我们可以重命名表并使用它时,为什么还要用重新映射域和表名来制造这种混乱呢


解决方案: 在数据库上执行如下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域)

接下来,您的域类“AgentTable”在各自的数据库中有一个表“agent\u table”。重命名Grails后,它甚至会告诉您需要什么:

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

它想在名为“agent”的表中查找值,但找不到。IntelliJ的重构函数不会重命名这些函数,因此它会