Hibernate grails/gorm:指定受';独特的';
我使用的是Grails2.4.2,但我怀疑这与ORM(hibernate)有更多的关系 我正在尝试在对象集合中重新分配序号属性。这种重新分配构成了对象的“重新洗牌” 鉴于:Hibernate grails/gorm:指定受';独特的';,hibernate,grails,gorm,Hibernate,Grails,Gorm,我使用的是Grails2.4.2,但我怀疑这与ORM(hibernate)有更多的关系 我正在尝试在对象集合中重新分配序号属性。这种重新分配构成了对象的“重新洗牌” 鉴于: class Bar { int i static belongsTo = [foo:Foo] static constraints = { i unique: 'foo' } } class Foo { static hasMany = [bars:Bar] static mappi
class Bar {
int i
static belongsTo = [foo:Foo]
static constraints = { i unique: 'foo' }
}
class Foo {
static hasMany = [bars:Bar]
static mapping = { bars sort: 'i' }
}
以及
如何使上述洗牌尝试顺利通过(即,不超过唯一约束)
谢谢:)由于ORM将逐个更新
条形图
实例,因此只有首先通过删除Foo
的所有条形图
实例,才能实现此目的
foo.bars*.delete(flush: true)
然后执行其余的测试代码
这是为什么?
Hibernate将为每个Bar
实例创建一个Update语句,并且很可能在第一次更新时失败。这里有一个例子。假设您已经有一个带有i=4
的Bar
实例。由于i
被声明为唯一,因此更新将失败
UPDATE bar SET i = 4 WHERE id = ?;
这就是为什么在开始刷新对数据库的更改之前,需要首先删除整个集合
条。希望这有助于解释问题。我不认为您应该将I
定义为唯一的。您应该使用复合键,以合并foo.id
和i
。否则,您将在不同的Foo实例之间遇到冲突
顺便说一句,如果您将Foo.bar
定义为List
,GORM会自动添加ix
位置列删除一组对象,以便我可以重新添加它们?我对这个感觉不太舒服。。。这是此类用例的最佳实践吗?请找到我上面的解释,谢谢。从技术上讲,我理解更新失败的原因。我对你最后的评论更感兴趣:如果你认为上述管理订单的方法是最糟糕的做法,你会怎么做?一开始我有一个列表栏,但后来又回到了grails的默认设置上——原因我再也记不起来了。那是你的建议吗?这会允许重新洗牌集合中的物品吗?谢谢@injecteer。具有明确的“i”属性允许使用非连续序号(例如“1,3,4,5,…”),并且不一定是基于0的。通常,“i”属性不仅用于排序,还用于为对象指定实际数字。我不知道你说的“陷入冲突”是什么意思。以前没有使用过复合键,但浏览文档表明它可能过度设计了一些与“unique”同样可以解决的问题。使用列表时添加“ix”:我不熟悉该功能。有记录吗?这是一个实际的域属性吗?我的意思是,如果您将I
仅用于排序,并且如果它同时是0-或1-或任何基于且唯一的属性,那么如果您尝试将相同的I
值分配给不同的条实例,则会导致冲突(很抱歉在原来的帖子中拼写错误)列被添加到列表
类型集合的表中,并作为列表
中的元素索引公开给域类。集合
s不需要它。这是ref doc声明的:在数据库级别的工作方式是Hibernate创建一个books\u idx列,在其中保存集合中的元素在数据库级别保留此顺序。
UPDATE bar SET i = 4 WHERE id = ?;