我使用jpa 2和hibernate 4来持久化/更新对象到数据库。要查看这些对象,使用带有jsf 2的网页,这一切都很有效。
我遇到以下问题:当我更新任何对象时,数据库(postgres)会将更新的对象放在数据库的最后一行。我想知道为什么会这样?数据库(或jpa或hibernate?)是否只更新行并将其保留在原来的位置? id当然永远不会改变。
INSERT INTO sector (id, code) VALUES(1, 'PRIVAAT');
INSERT INTO sector (id, code) VALUES(2, 'PUBLIEK');
Select * from sector;
返回每个查询数据库的程序:
1 privaat
2 publiek
现在我更新了第一行:
update sector set code = 'privaat' where id = 1;
现在它会在每个程序中返回:
2 publiek
1 privaat
使用我们的应用程序时也是如此,而应用程序又使用Postgres作为DB。
但是,在我们的回归测试中,它在内存DB HSQLDB中使用,它总是返回:
1 privaat
2 publiek
回归测试显然是我们对数据库的期望,并且在使用其他数据库之前没有这种行为。
问题是在网络中我们希望保留订单,以便用户不必搜索数据:它始终是固定的位置。特别是在为用户处理大量引用数据时,这非常烦人。测试证实了这一点,但应用程序(使用不同的DB)的工作方式不同。
我们现在唯一的解决方案就是在id上按条款放置到处处,但是我们希望有一种保持顺序的简洁方法。在任何地方使用订单也有很小的性能影响...
所以我的问题是,这是由于特定数据库的工作方式(依赖于供应商)吗?或者这是由于JPA映射查询以不同的方式取决于方言?如果这是第二种情况,是否有一个属性可以保留JPA中的顺序(或者可能是休眠)?
答案 0 :(得分:2)
那里没有订单。您只是获得了从堆中读取行的半随机顺序。
如果您想要订购,请使用ORDER BY
。
由于数据的结构(例如,作为b-tree表),某些数据库实现具有自然顺序。 PostgreSQL使用堆,所以除非你要求,否则没有订单。