域类的Grails包更改导致DuplicateMappingException

域类的Grails包更改导致DuplicateMappingException,exception,grails,import,duplicates,mappings,Exception,Grails,Import,Duplicates,Mappings,在学习Grails的教程中,我犯了一个错误并运行了: grails create-domain-class com.FooBar 而不是: grails create-domain-class com.acme.FooBar 很明显,我犯了一个错误,因此我尝试了以下方法: 在搜索一个反转createdomain类命令的函数时,似乎没有 在web上搜索建议,共识是您可以删除域类文件、任何关联的视图和测试,然后为了安全起见,在项目目录中对您的类名进行文本搜索,查找您可能遗漏的任何引用。这一切我都

在学习Grails的教程中,我犯了一个错误并运行了:

grails create-domain-class com.FooBar
而不是:

grails create-domain-class com.acme.FooBar
很明显,我犯了一个错误,因此我尝试了以下方法:

  • 在搜索一个反转createdomain类命令的函数时,似乎没有
  • 在web上搜索建议,共识是您可以删除域类文件、任何关联的视图和测试,然后为了安全起见,在项目目录中对您的类名进行文本搜索,查找您可能遗漏的任何引用。这一切我都做了
  • 然后我运行了正确的命令来创建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”解决方案的情况下重构包

    谢谢。

    你不应该这样做

    static mapping = {
            autoImport false
        }
    
    正如你们所说的,通过这样做,你们不需要仅仅通过名称来检查域名,也可以查找包。因此,一旦您这样做,您将不得不在查询/HQL中使用类的完全限定名,这有时可能会让人感到不舒服

    您应该完全删除该域,即

  • 删除域
  • 删除默认情况下创建的具有相同名称的视图文件夹,控制器也是如此
  • 现在,执行grails clean all(对于意外发生的任何问题,首先使用grails clean all是一条经验法则)
  • 为了更准确,请从项目中删除目标目录,然后运行grails run app
  • 我做了很多次同样的事情,并通过以上步骤解决了问题


    希望有帮助。

    我会删除
    autoImport
    并尝试运行
    grails clean
    。感谢Joshua,删除了
    autoImport
    ,然后运行
    grails clean
    ,它成功了!在教程介绍这个基本命令之前遇到了我的问题。谢谢Vinay,删除了
    autoImport
    ,然后运行
    grails clean
    ,它成功了!在教程介绍此基本命令之前遇到我的问题。请不要提及!不过,在grails clean证明是徒劳的情况下,我们建议使用grails clean all。