【问题标题】:jpa preserve order in database after updatejpa在更新后保留数据库中的顺序
【发布时间】: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


【解决方案1】:

那里没有订单。您只是获得了碰巧从堆中读取行的半随机顺序。

如果您想订购,请使用ORDER BY

由于数据的结构方式(例如,作为 b 树表),一些数据库实现具有自然排序。 PostgreSQL 使用堆,所以除非你要求,否则没有顺序。

【讨论】:

  • 查找后发现 Oracle 和 HSQLDB 使用 b-tree 而不是 postgres :( 将不得不到处使用 orderby... tnx
  • @FabiYo:Postgres 也使用 b-tree 作为索引——就像 Oracle 和 HSQLDB。 Oracle 也不会以任何特定顺序返回行。
  • 主要看自己的表是存储为b树还是堆。 “聚集索引”、“索引组织表”等往往具有自然排序。即使存在索引,堆也不会。
猜你喜欢
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
相关资源
最近更新 更多