Hibernate grails/gorm:指定受';独特的';

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

我使用的是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 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 = ?;