【问题标题】:Hibernate: @OrderBy vs @OrderColumn to maintain the order of a collectionHibernate:@OrderBy 与 @OrderColumn 维护集合的顺序
【发布时间】:2012-07-11 12:58:19
【问题描述】:

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

我知道@OrderBy 更像是一种内存排序,只有当您按照您选择的列的顺序保留行时才能进行检索。

假设我选择使用由数据库序列支持的列,将休眠确保集合中的元素以与集合中相同的顺序保存(例如列表)。

有什么想法吗?

更多细节:

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

Class A {
  List<B> bList;
}

我一直想保留 A 中元素 B 的顺序,如下所示:

bList = { b1, b2, b3 }

实现的一种方法是使用@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 始终保持与列表中出现的顺序相同的顺序。

【问题讨论】:

    标签: hibernate


    【解决方案1】:

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

    @OrderBy("lastname ASC")
    public List<Student> students;
    

    会生成类似的 SQL 查询

    select ... order by student.lastname ASC
    

    OrderColumn 定义表中附加列的名称,包含列表中实体的索引。如果更改列表中元素的顺序,Hibernate 将更改此列的值。如果您的学生在此列中有 0、3 和 5 作为值,则列表将是

    [student0, null, null, student3, null, student5]
    

    这在这两个注释的the javadoc 中有很好的描述。

    编辑:

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

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

    因此,如果您希望列表按此顺序保存 b1、b2 和 b3,无论它们以何种方式持久化,最好的办法是在集合中添加 @OrderColumn 注释。 Hibernate 将自动在此列中填充 b1 的 0、b2 的 1 和 b3 的 2。当您重新加载父实体时,它们将在列表中以相同的顺序排列。

    【讨论】:

    • 是的,我已经知道每个注释的用途。我的具体问题是关于保留集合中的顺序,因为在某些时候我们可以同时使用它们。还有关于我关于休眠持续列表顺序的问题的任何想法。
    • 你的问题没有多大意义。如果您使用 OrderBy,并更改列表中学生的姓氏,则下次加载学生时,列表将按新的姓氏值排序。如果使用 OrderColumn,Hibernate 将使用列表中元素的索引来填充 order 列。因此,索引 0 处的实体行将填充值 0。执行插入/更新查询的顺序完全不相关。
    • 不确定您是否理解该问题,我已在问题中添加了更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 2013-11-21
    • 2011-12-18
    • 1970-01-01
    • 2013-11-19
    • 2011-04-11
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多