我有一个主表A(域类),我在其中维护一个值列表(例如国家/地区)。这与域类B(例如用户)作为列表相关联,并通过连接表进行映射。
当我删除域B(通过删除orphan)时,我想删除连接表中与B关联的A项列表,但grails(或更确切地说是hibernate)尝试删除域A中的主记录我也不想要。如何告诉grails停止连接表中的级联行为并单独保留主表?
class Country {
String name
}
class User{
List<Country> visitedCountries
static hasMany = [visitedCountries: Country]
static mapping = {
country joinTable: [name: 'Visited_Countries'], cascade: 'all-delete-orphan'
}
}
答案 0 :(得分:0)
让Grails独自离开Country
的最好方法是使用多对多关系而不是一对多关系。
当您考虑它时,一对多宣称Country
如果没有User
就不能存在。特定于User
的内容会更有意义,例如电子邮件帐户列表。
然而,对于多对多,两个域类都可以独立存在。它们可以是相关的,但不一定是。
class Country {
String name
static hasMany = [users: User]
static belongsTo = User
}
class User{
List<Country> visitedCountries
static hasMany = [visitedCountries: Country]
// excluded mapping since I don't know what it needs to be in your case.
}
您可以在我的articles之一中看到一对多,多对多,多对一和一对一的比较。
答案 1 :(得分:0)
行。所以问题不是映射本身,而是我给出的级联选项。我相信正在发生的事情是当我从关系列表中删除国家/地区对象时,hibernate将这些对象视为孤立并尝试删除它们。只是删除级联:'all-delete-orphan'解决了我的问题。我觉得自己像一个白痴,但是一个放心的白痴现在有点聪明,并且对GORM的了解要好一些。
class Country {
String name
}
class User {
List<Country> visitedCountries
static hasMany = [visitedCountries: Country]
static mapping = {
visitedCountries joinTable: [name: 'Visited_Countries']
}
}