我面临着与此博客文章(从2010年开始!)密切相关的grails(3.1.11)中的一个奇怪问题:
http://codedumpblog.blogspot.de/2010/02/grails-many-to-many-with-lists.html

我正在尝试建立以下简单关系的模型:

  • 有两种父类型(OrganizationPerson)在Address关联中共享子类型(hasMany)。
  • Address只能属于其中一个 parent ,而不能同时属于两个 parent 。
  • 删除OrganizationPerson应该删除其所有Address -es。

  • 到目前为止,我有以下代码:
    class Organization {
        List addresses
    
        static hasMany = [addresses: Address]
    
        static mapping = {
            addresses sort: 'country', order: 'asc', cascade: "all-delete-orphan"
        }
    }
    
    class Person {
        List addresses
    
        static hasMany = [addresses: Address]
    
        static mapping = {
            addresses sort: 'country', order: 'asc', cascade: "all-delete-orphan"
        }
    }
    
    class Address {
        String country
        //...truncated...
    
        static belongsTo = [organization: Organization,
                            person  : Person]
    
        static constraints = {
            organization nullable: true
            person nullable: true
        }
    }
    

    但是运行此命令后,我得到了以下Hibernate异常:



    就像在博客文章中一样,仅当addresses字段在两个父类中具有相同的名称时,才会出现问题。如果我将字段分别重命名为organizationAddressespersonAddresses,那么一切都会按预期进行。

    我希望该字段保留为addresses,所以我不必调用organization.organizationAddressesperson.personAddresses之类的东西。

    这个将近7年的期刊是否有现代化的解决方法?

    最佳答案

    问题

    这看起来像是休眠错误。当您创建一个具有Class且由 many-to-one连接的两个关系时发生

    在您的情况下,有两种与Address相关的类,即hasMany
    解决方案

    membership关系替换use关系。您的情况是这样完成的:

    创建一个ListAddresses类来保存PersonOrganization的地址:

    class ListAddresses {
        List addresses
    
        static hasMany = [addresses: Address]
    
        static mapping = {
            addresses sort: 'country', order: 'asc', cascade: "all-delete-orphan"
        }
    }
    

    删除Address中的所有关系并创建新的关系:
    class Address {
        String country
        //...truncated...
    
        static belongsTo = [list:ListAddresses]
        /*static belongsTo = [organization: Organization,
                        person  : Person]*/
    
        static constraints = {
            /*organization nullable: true
            person nullable: true*/
        }
    }
    

    ListAddressesPerson中使用Organization
    class Organization {
        ListAddresses addresses
    
        static mapping = {
            addresses cascade: "all-delete-orphan"
        }
    }
    
    class Person {
        ListAddresses addresses
    
        static mapping = {
            addresses cascade: "all-delete-orphan"
        }
    }
    

    该答案基于问题。但就我而言,该解决方案更容易,因为我替换了belongsTo关系而不是hasMany

    关于hibernate - Grails-IndexBackref的重复属性映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40848934/

    10-10 19:28