Hibernate 对具有复合键的子实体执行错误的插入顺序

Posted

技术标签:

【中文标题】Hibernate 对具有复合键的子实体执行错误的插入顺序【英文标题】:Hibernate does wrong insertion order for child entities with composite keys 【发布时间】:2015-05-12 04:35:19 【问题描述】:

我有一个依赖于插入顺序的表(我无法更改的不良遗留设计)并且以错误的顺序插入了临时实体。有问题的表称为“平均值”,它是“信念”的子实体。当session.save(belief); 被调用时,动作被级联到作为列表存储在信念类中的子平均实体。 Mean 实体以适当的顺序存储在 confidence.getMeans() 列表中,但是一旦持久化到数据库中,它们就会按其复合键的顺序插入。例如,如果要插入 3 个均值实体,其顺序和组合键如下:

[1, 1], [1, 3], [1, 2]

它们将按复合键的顺序插入,如下所示:

[1, 1], [1, 2], [1, 3]

知道是什么原因造成的吗?我认为 Hibernate 应该根据它们在列表中出现的顺序插入? 我什至尝试在每个 Mean 实体上单独运行 session.save() 以查看这是否会产生影响,但它没有。

感谢您的帮助!

编辑:所以我最终做的是在 Mean 表中添加一个名为 col_index 的新列,该列在结果矩阵中保存 Mean 的列索引。我将 javax.persistence.OrderBy 注释与新的 col_index 列一起使用,因此平均实体列表以适当的顺序返回。虽然,这仍然不能解决插入顺序问题,我仍然希望对此有答案。但是,就目前而言,这个解决方案就足够了。

【问题讨论】:

我可以知道插入顺序如何可靠/对表格有影响吗? 平均实体的插入顺序也决定了结果矩阵中均值的列索引。因此,如果两个实体打开插入(如示例中),那么这些列会切换。 请参考this 这可能会有所帮助 - 不是答案,问题指定他在每次插入后使用保存而不是交易来保留订单 【参考方案1】:

我认为你应该使用@OrderColumn 而不是@OrderBy。

@OrderBy 注解用于获取 Collection 元素但 Hibernate 不维护顺序。

@OrderColumn allows Hibernate 将元素 Collection 索引持久化到指定的 order 列中,然后在获取 collection 时使用。

【讨论】:

【参考方案2】:

如果您使用的是 Hibernate 注解,则可以使用 @OrderBy("") 注解来指定子实体的顺序。请参考this.

您可能应该使用单独的属性来自定义排序并使用@OrderBy 中的属性。

【讨论】:

这就解释了为什么它在主键上排序,因为它是默认值。但是它怎么能按照原来的顺序来订购呢?我在这些文档中没有看到该选项。

以上是关于Hibernate 对具有复合键的子实体执行错误的插入顺序的主要内容,如果未能解决你的问题,请参考以下文章

休眠仅保存具有复合主键中的父外键的子表条目

级联保存具有外键的实体对象作为复合主键的一部分

学说:具有复合键的实体之间的 ManyToX 关系

实体框架:如何从具有复合键的表中返回一行?

使用实体框架将行插入到具有复合键的表中

没有复合键的休眠中的多对多