带算术运算的executeUpdate不会更改列

时间:2013-12-10 17:42:24

标签: hibernate eclipselink jpa-2.0

我正在尝试在某个应用中进行手动订购。 用于更新字段的JPAQL是这样的:

update SortableBean s set s.position = s.position + 1 where s.position >= :initialPosition and s.position < :finalPosition

executeUpdate(据我所知是更改的行数)的返回是正确的,但@Versionposition字段都没有更改。

我已经建立了一个示例项目并使用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))

1 个答案:

答案 0 :(得分:0)

感谢@Chris和他的comment,这让我想到了真正的问题。

问题在于我正在进行批量更新,但没有清除持久性上下文。

基本上,修正是this commit

我也有一个错误的断言,但这是我遇到的最少的问题。

谢谢大家!