我面临着与此博客文章(从2010年开始!)密切相关的grails(3.1.11)中的一个奇怪问题:
http://codedumpblog.blogspot.de/2010/02/grails-many-to-many-with-lists.html
我正在尝试建立以下简单关系的模型:
Organization
和Person
)在Address
关联中共享子类型(hasMany
)。 Address
只能属于其中一个 parent ,而不能同时属于两个 parent 。 Organization
或Person
应该删除其所有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
字段在两个父类中具有相同的名称时,才会出现问题。如果我将字段分别重命名为organizationAddresses
和personAddresses
,那么一切都会按预期进行。我希望该字段保留为
addresses
,所以我不必调用organization.organizationAddresses
和person.personAddresses
之类的东西。这个将近7年的期刊是否有现代化的解决方法?
最佳答案
问题
这看起来像是休眠错误。当您创建一个具有的Class
且由 many-to-one
连接的两个关系时发生
在您的情况下,有两种与Address
相关的类,即hasMany
解决方案
用membership
关系替换use
关系。您的情况是这样完成的:
创建一个ListAddresses
类来保存Person
或Organization
的地址:
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*/
}
}
在
ListAddresses
或Person
中使用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/