Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate:@OrderBy vs@OrderColumn来维护集合的顺序_Hibernate - Fatal编程技术网

Hibernate:@OrderBy vs@OrderColumn来维护集合的顺序

Hibernate:@OrderBy vs@OrderColumn来维护集合的顺序,hibernate,Hibernate,在持久化和从数据库检索时,维护集合顺序的首选方法是什么 我知道@OrderBy更像是一种内存内排序,只有当您按所选列的顺序预先列出行时,它才可能用于检索 假设我选择使用一个由数据库序列支持的列,那么hibernate将确保集合中的元素以与集合中相同的顺序持久化(比如列表) 有什么想法吗 更多详情: 假设我有一个类a,它与类B有一对多的关系。B有一个主键字段“Id”,它由DB中的序列支持 Class A { List<B> bList; } 实现的一种方法是使用@OrderBy(

在持久化和从数据库检索时,维护集合顺序的首选方法是什么

我知道@OrderBy更像是一种内存内排序,只有当您按所选列的顺序预先列出行时,它才可能用于检索

假设我选择使用一个由数据库序列支持的列,那么hibernate将确保集合中的元素以与集合中相同的顺序持久化(比如列表)

有什么想法吗

更多详情: 假设我有一个类a,它与类B有一对多的关系。B有一个主键字段“Id”,它由DB中的序列支持

Class A {
  List<B> bList;
}
实现的一种方法是使用@OrderBy(“Id ASC”)。只有当列表B按如下顺序持久化时,这才有效:

----------------
Id ----bValue
----------------

1------ b1
2------ b2
3-------b3
------------------
当我们检索时,因为它是按Id排序的,所以保持顺序

假设集合B以以下方式持久化:

----------------
Id ----bValue
----------------
1------ b2
2------ b1
3-------b3
------------------

当我们检索时,列表B的顺序会发生变化(因为它是按Id列排序的)。因此,我的问题是,集合B是否始终保持与列表中显示的顺序相同。

OrderBy向生成的SQL中添加order by子句,以按目标实体表的一列对检索到的集合的成员进行排序:

@OrderBy("lastname ASC")
public List<Student> students;
OrderColumn定义表中另一列的名称,该列包含列表中实体的索引。如果更改列表中元素的顺序,Hibernate将更改此列的值。如果您的学生在此列中有0、3和5作为值,则列表将为

[student0, null, null, student3, null, student5]
这在这两个注释的其中一个中有很好的描述

编辑:

B标识符的分配顺序取决于如何持久化这些B实例:

  • 如果您明确地调用
    session.saveOrUpdate()
    session.save()
    ,这将为实体分配一个ID,因此为b1、b2和b3调用它将遵循顺序
  • 好吧,所有其他方法(级联、合并()、持久化())都不能保证任何顺序(除非您合并或持久化,然后
    flush()

因此,如果希望列表按此顺序保存b1、b2和b3,而不管它们是以何种方式保存的,那么最好的办法是向集合中添加一个
@OrderColumn
注释。Hibernate将自动在该列中填充0表示b1,1表示b2,2表示b3。当您重新加载父实体时,它们在列表中的顺序将相同。

是的,我已经知道每个注释的用途。我的具体问题是关于保留集合中的顺序,因为在某个时候我们可以同时使用它们。还有关于我关于hibernate持久化顺序列表的问题。你的问题没有多大意义。如果使用OrderBy并更改列表中学生的姓氏,则下次加载学生时,列表将按新的姓氏值排序。如果使用OrderColumn,Hibernate将使用列表中元素的索引来填充order列。因此,索引0处的实体行将填充值0。insert/update查询的执行顺序完全不相关。我不确定您是否理解这个问题,我已经为这个问题添加了更多细节。
select ... order by student.lastname ASC
[student0, null, null, student3, null, student5]