【发布时间】:2015-11-06 10:08:28
【问题描述】:
我使用 jpa 2 和 hibernate 4 将对象持久化/更新到数据库。要查看这些对象,请使用带有 jsf 2 的网页,这一切都很好。
我遇到以下问题:当我更新任何对象时,数据库 (postgres) 会将更新后的对象放在数据库的最后一行。我想知道为什么会这样?数据库(或者它是 jpa 还是休眠?)不能只更新行并将其留在原处吗? id 当然永远不会改变。
INSERT INTO sector (id, code) VALUES(1, 'PRIVAAT');
INSERT INTO sector (id, code) VALUES(2, 'PUBLIEK');
Select * from sector;
在每个查询数据库的程序中返回:
1 个隐私
2 公开
现在我更新第一行:
update sector set code = 'privaat' where id = 1;
现在它在每个程序中返回:
2 公开
1 隐私
在使用我们的应用程序时也是如此,而后者又使用 Postgres 作为 DB。
但是,在我们使用内存数据库 HSQLDB 的回归测试中,它总是返回:
1 个隐私
2 公开
回归测试显然是我们对数据库的期望,并且以前在其他数据库中没有这种行为。
问题在于,我们希望在网络中保留顺序,以便用户不必搜索数据:它始终是固定位置。特别是在为用户处理大量参考数据时,这非常烦人。测试证实了这一点,但应用程序(使用不同的数据库)的工作方式不同。
我们现在唯一的解决方案是在 id 上按子句排序,但我们希望有一种干净的方式来保留顺序。使用无处不在的 order by 也会对性能造成很小的影响......
所以我的问题是,这是由于特定数据库的工作方式(取决于供应商)吗?或者这是由于 JPA 映射查询以不同的方式取决于方言?如果这是第二种情况,是否有一个属性可以保留 JPA 中的顺序(或者可能是休眠)?
【问题讨论】:
-
定义“最后一行”。它使用 UPDATE 语句更新 DB 行。您的查询是拉回数据的原因,并且该查询可以使用您所说的 ORDER BY 子句,因此如果您需要一些排序,请使用 ORDER BY。这就是你应该保证订购的方式
-
我将举例说明。我插入两行,第 1 行 id = 1,第 2 行 id = 2。当我选择全部时,它总是返回(在我使用的任何程序中)第一行 id=1 和第二行 id=2 的两行。我通过 JPA 更新 id=1 的行的一列。现在,当我选择全部时,它总是返回两行,第一行 id=2,第二行 id=1……神秘:)
-
不,我的意思是如果我在更新后进行查询,订单会发生变化。仅且仅在更新后订单才会更改。
-
您没有提供“示例”查询。请使用真实代码和真实查询更新您的问题,否则没有人会知道您在做什么。不,不要在 cmets 中添加代码。
-
这篇文章中的用户流利说这是由于 postgres 的工作方式:stackoverflow.com/questions/369362/…。这是我们第一次将postgres用于项目并且不熟悉它如何在数据库中存储数据。但是,我们的回归测试使用内存中的 HSQL DB。哪个确实保留了订单,而不是您在表格上执行的更新。所以我们的测试成功了,但我们的应用程序失败了。由于我们使用 JPA 作为你的 ORM 框架,我想知道 JPA 是否可能是罪魁祸首,因为它使用特定的方言来映射查询......
标签: database hibernate postgresql jpa sql-update