1

在通过教程开始学习 Grails 时,我犯了一个错误并运行:

grails create-domain-class com.FooBar

代替:

grails create-domain-class com.acme.FooBar

很明显我犯了一个错误,所以我尝试了以下方法:

  1. 搜索了一个反转 create-domain-class 命令的函数,似乎没有。
  2. 在网上搜索了建议,一致认为您可以删除域类文件、任何关联的视图和测试,然后为了安全起见,在项目目录中对您的类名进行文本搜索,以查找您可能错过的任何参考。我已经完成了这一切。
  3. 然后我运行了正确的命令来创建 com.acme.FooBar,它起作用了。

在此之后,应用程序无法运行并报告以下错误:

org.hibernate.DuplicateMappingException: duplicate import: FooBar refers to both com.acme.FooBar and com.FooBar (try using auto-import="false")

将以下代码添加到 com.acme.FooBar 后:

...
static mapping = {
    autoImport false
}
...

该应用程序现在按预期运行。

然而,作为一个偶尔会重构包的经验丰富的 Java 开发人员,我想了解如何在不导致 DuplicateMappingException 或诉诸“autoImport false”解决方案的情况下做到这一点。

谢谢。

4

1 回答 1

2

你不应该这样做

static mapping = {
        autoImport false
    }

因为,通过这样做,您说不要仅按名称检查域并查找包。因此,一旦这样做,您将不得不在查询/hqls 中使用类的完全限定名称,这有时可能会发痒。

您应该完全删除域,即

  1. 删除域
  2. 删除默认创建的具有相同名称的视图文件夹,控制器也是如此
  3. 现在,执行 grails clean-all(对于任何意外发生的问题,首先使用 grails clean-all 成为一个经验法则)。
  4. 为了更准确,请从项目中删除目标目录,然后运行 ​​grails run-app。

我做了很多次同样的事情,并通过上述步骤解决了它。

希望能帮助到你。

于 2015-10-28T13:30:03.053 回答