我有一个遗留数据库,我正在使用Grails。错误#1。grails复合密钥更新
它使用化合物密钥。错误#2。
鉴于这些领域类:
Movie {
static hasMany = [ roles: Role ]
}
Person {
static hasMany = [ roles: Role ]
}
Role {
Movie movie
Person person
String foo
}
我想从一个人移动角色到另一个,就像这样:
Role x = person1.roles[0]
x.person = person2
save(flush:true)
但没有任何反应。完全一样。我在log4j中打开了hibernate的跟踪和调试级别日志记录,并且没有显示更新语句。但是,如果我这样做:
Role x = person1.roles[0]
x.person = person2
x.foo = "i can haz update?"
save(flush:true)
更新确实发生了FOO,但外键指向人不被修改,如图:
DEBUG hibernate.SQL - update ct_roles set foo=? where movie_id=? and person_id=?
TRACE sql.BasicBinder - binding parameter [1] as 'i can haz update?'
TRACE sql.BasicBinder - binding parameter [2] as [BIGINT] - 999
TRACE sql.BasicBinder - binding parameter [3] as [BIGINT] - 2
注意PERSON_ID 2属于PERSON2 ,目前它还没有角色,所以更新失败。
因此,短的只是删除旧角色并创建一个新的连接到期望的人,有什么办法解决?
于是,我放弃了对更新的方法,并试图删除旧/插入新的,但是,即使是失败了。 GORM不会让我oldRole.delete(),因为它仍然与oldPerson有关联。我不能oldPerson.removeFromRoles(oldRole); oldRole.delete()因为在那时,oldRole.person == null,并且Hibernate试图从TABLE中删除person_id = null,并且失败。我无法逆转订单,因为“删除行将在保存级联期间被重新创建”。 有血的砖墙,我一直在敲打我的头下的地板上的池,而墙的名字是GORM。 – 2012-08-15 22:22:08