如何在逆向工程期间或逆向工程之后重命名域类。
我在Groovy和Grails中使用逆向工程生成了类。
域类名称为AgentTable。我想把它重命名为Agent。当我使用IntelliJ (右键单击-重构-重命名)重命名域类时,它将AgentTable重命名为代理。但是当我启动服务器(运行应用程序)时,给出错误“嵌套异常是org.hibernate.HibernateException: Missing table: agent”
我必须为几个领域类做这件事。不管怎样,我可以在对域类进行逆向工程时给出一个替代名称。
或者在创建域类之后,如何在不出现此错误的情况下重命名它。
发布于 2017-04-25 03:48:50
查看数据库中它为代理创建的表的名称。知道表的名称后,在新域中添加以下内容
static mapping = {
table "table-name-here"
}
发布于 2018-02-20 23:03:59
虽然它有效,但我不推荐@elixir的方法。
在我看来,映射不应该用于重命名。这也是我对官方documentation的理解。
在示例中,他们使用它将Person映射到“people”表,这不是因为重命名,而是因为语义原因。表通常以复数形式命名。关于这个问题,Here是一个很好的答案。在我正在处理的项目中,域对象'User‘被映射到表'users’。不能使用表名'user‘,因为它是SQL语句。
假设和说明:
在我的经验中,Grails在这些规则之后将域名映射到表名(例如域名'MyExampleDomain':
域名由大写字母分隔(My Example
underlines
在此之后,您的域类'AgentTable‘在您各自的数据库中有一个表'agent_table’。在重命名后,Grails甚至会告诉你它想要什么:
嵌套异常为org.hibernate.HibernateException:缺少表: agent
它想要在名为“agent”的表中查找值,但找不到。IntelliJ的重构函数不重命名函数,因此它将错过数据库。
幸运的是,我们确切地知道它想要什么值--之前在'agent_table‘中找到的值。
那么,为什么要在重新映射域和表名称时造成这种混淆,因为我们可以只重命名表并完成它?
解决方案:
在您的数据库上执行如下SQL脚本:
ALTER TABLE <old_domain_name> RENAME TO <new_domain_name>;
名字当然是以“表格形式”出现的。
这只是重命名您的表以匹配Grails中的预期格式。当重新启动时,一切都应该正常。
但是,您不需要使用rename。您还可以创建一个全新的表,按照域对象希望的方式构建它,然后迁移数据。有关何时使用what的信息,请参阅“此方法的问题”一节。
此方法存在以下问题:
与往常一样,如果您不小心,对程序所依赖的信息(甚至是生成的信息)进行修补通常会产生一些可怕的后果。
例如,我们必须注意键。如果您的域对象与其他对象有关系,它将通过外键将它们保存在表中。根据您选择如何迁移表中的信息,您可能已经删除了这些外键连接。您必须通过单独的SQL语句添加它们。当您选择重新创建表时,这肯定会发生。重命名应该保留密钥。
另一个是列名。如果选择重命名属性,则还必须通过SQL重命名列。您还必须记住其他表在您要重命名的表上可能具有的外键。RENAME自动为我做了这件事,但你应该仔细检查。
为什么你仍然应该坚持这种方法:
将域对象重新映射到具有旧名称的表,势必会产生代码气味和混乱。您真的想在您的脑海中记住这些映射吗?更重要的是:你真的希望其他人也要这样做吗?
最好的情况是,如果人们甚至不知道这个对象是否有过不同的名称,而更改数据库是我所知道的实现这一点的最好方法。
https://stackoverflow.com/questions/43595879
复制相似问题