【问题标题】:What's the best way to order collections in Hibernate?在 Hibernate 中订购集合的最佳方式是什么?
【发布时间】:2012-06-24 23:00:27
【问题描述】:

我有一个 Hibernate 类的子值列表。我最初的实现是一个 Set,但它返回的值本质上是“数据库顺序”(可能基于聚集索引,这几乎是插入顺序)。

我考虑切换到 List,所以我添加了一个 ,但我很快遇到了一个问题,即返回的 java List 中有空值。我的一些数据是由 Hibernate 编写的,但也有一些是由 SQL 脚本编写的。

我想要的是一个与列表中的位置无关的 sortOrder 属性,这样如果有重复,即 { 1, 3, 3, 10 } 它会适当地映射到 { 0, 1, 2, 3} 其中第 2 项和第 3 项的顺序回退到数据库顺序。 Null 也很好,我不在乎它们是放在列表的前面还是后面(只要行为一致)。

我查看了 Bag,但不确定如何将 sortOrder 属性添加到定义中,而且我有点担心它会允许重复。我仍然希望拥有与使用 Set 时相同的约束(我相信父/子元组始终是唯一的)。

建议?我可以调整 Bag 以使其充当带有 sortOrder 的列表而不是带有索引的列表吗?我还需要做些什么来保护代码不被 SQL 直接输入的数据挂起?

【问题讨论】:

    标签: hibernate list set bag


    【解决方案1】:

    在我正在进行的一个项目中,我也遇到了同样的问题。我能想到的最后一个办法是使用数据库触发器来保持这些位置数据的正确顺序。触发器获取列表中的记录并将它们排列在正确的位置并更新位置。

    当您使用 sql 和 hibernate 更改数据时,我认为您不会有任何其他选择。

    【讨论】:

    • 行可见时间和触发器更新时间之间是否存在竞争条件?创建架构后,我猜您正在运行 SQL 来添加触发器?
    • 我使用的是 sql server 并且触发器是事务过程的一部分,因此不会有时间问题。触发器是在 sql 中编写的,只是作为更新触发器添加到存在问题的表上。这种方式非常干净,可以阻止所有空值进入您的位置列。
    • 我肯定会考虑它,但到目前为止我是数据库不可知论者,所以我更愿意找到 100% Hibernate 解决方案。你玩过 Bags 吗?
    • 我做了一点,但我发现它很难进行。我同意保持解决方案数据库不可知,但每个数据库都支持触发器,因此不会有太大的权衡。
    【解决方案2】:

    如果你使用hibernate注解,你可以使用javax.persistence.OrderBy通过指定属性对“内存中”的元素进行排序,而不需要引入索引列,参见:

    http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-hibspec-collection

    【讨论】:

    • 我没有使用注释,我只有一个 hbm 文件,其中包含了架构。我看到了 orderBy 机制,但我更喜欢将大部分排序保留在数据库中,因为对于我的许多实现来说,这实际上是一个独立的大盒子,比应用程序盒子更强大。
    • 另外,我真的很想要一个 sortOrder 列,因为我不是按数据排序,而是按用户的数据顺序排序(这无疑有点不合理:-)跨度>
    猜你喜欢
    • 2013-01-19
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2017-04-05
    相关资源
    最近更新 更多