我正在尝试在某个应用中进行手动订购。 用于更新字段的JPAQL是这样的:
update SortableBean s set s.position = s.position + 1 where s.position >= :initialPosition and s.position < :finalPosition
executeUpdate
(据我所知是更改的行数)的返回是正确的,但@Version
或position
字段都没有更改。
我已经建立了一个示例项目并使用Hibernate和EclipseLink进行了测试,两者都使用JPA2,而原始项目是使用较旧的Hibernate版本。在我能想象的所有测试用例中,我都有相同的例外。
我的示例项目点:
如果您获得代码并使用mvn clean install -Dtest=SortableTests
运行测试,您将看到如下输出:
Sortable ID - POS - VERSION
------------------
BEFORE
Sortable 1 - 0 - 1
Sortable 2 - 1 - 1
Sortable 3 - 2 - 1
Sortable 4 - 3 - 1
Sortable 5 - 4 - 1
INITIAL=0 FINAL=3
UPDATED 3 ITEMS
AFTER
Sortable 4 - 0 - 2
Sortable 1 - 0 - 1
Sortable 2 - 1 - 1
Sortable 3 - 2 - 1
Sortable 5 - 4 - 1
换句话说,看起来它没有更新汇总值,所以,我得到了重复的位置。
有关于此的任何想法吗?
生成的SQL似乎是正确的想法:
UPDATE sortables SET version = (version + 1), pos = (pos + 1) WHERE ((pos >= 0) AND (pos < 3))
答案 0 :(得分:0)
感谢@Chris和他的comment,这让我想到了真正的问题。
问题在于我正在进行批量更新,但没有清除持久性上下文。
基本上,修正是this commit。
我也有一个错误的断言,但这是我遇到的最少的问题。
谢谢大家!